mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-07-07 16:25:01 +03:00
v4.03-9411-rtm
This commit is contained in:
188
src/BuildUtil/CoreUtil/Bmp.cs
Normal file
188
src/BuildUtil/CoreUtil/Bmp.cs
Normal file
@ -0,0 +1,188 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public static class Bmp
|
||||
{
|
||||
public static Bitmap Load(string filename)
|
||||
{
|
||||
return Load(IO.ReadFile(filename));
|
||||
}
|
||||
public static Bitmap Load(byte[] data)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
ms.Write(data, 0, data.Length);
|
||||
ms.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
return new Bitmap(ms);
|
||||
}
|
||||
|
||||
public static void SaveAsBitmap(Bitmap bmp, string filename)
|
||||
{
|
||||
IO.SaveFile(filename, SaveAsBitmap(bmp));
|
||||
}
|
||||
public static byte[] SaveAsBitmap(Bitmap bmp)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
|
||||
bmp.Save(ms, ImageFormat.Bmp);
|
||||
|
||||
return ms.ToArray();
|
||||
}
|
||||
|
||||
public static void SaveAsJpeg(Bitmap bmp, string filename)
|
||||
{
|
||||
IO.SaveFile(filename, SaveAsJpeg(bmp));
|
||||
}
|
||||
public static byte[] SaveAsJpeg(Bitmap bmp)
|
||||
{
|
||||
return SaveAsJpeg(bmp, 100);
|
||||
}
|
||||
public static void SaveAsJpeg(Bitmap bmp, string filename, int quality)
|
||||
{
|
||||
IO.SaveFile(filename, SaveAsJpeg(bmp, quality));
|
||||
}
|
||||
public static byte[] SaveAsJpeg(Bitmap bmp, int quality)
|
||||
{
|
||||
EncoderParameters eps = new EncoderParameters(1);
|
||||
EncoderParameter ep = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
|
||||
eps.Param[0] = ep;
|
||||
|
||||
ImageCodecInfo info = getEncoderInfo("image/jpeg");
|
||||
|
||||
MemoryStream ms = new MemoryStream();
|
||||
bmp.Save(ms, info, eps);
|
||||
|
||||
return ms.ToArray();
|
||||
}
|
||||
|
||||
static ImageCodecInfo getEncoderInfo(string type)
|
||||
{
|
||||
ImageCodecInfo[] encs = ImageCodecInfo.GetImageEncoders();
|
||||
|
||||
foreach (ImageCodecInfo enc in encs)
|
||||
{
|
||||
if (Str.StrCmpi(enc.MimeType, type))
|
||||
{
|
||||
return enc;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Bitmap ResizeBitmap(Bitmap bmp, int width, int height)
|
||||
{
|
||||
Bitmap dst = new Bitmap(width, height, PixelFormat.Format24bppRgb);
|
||||
Graphics g = Graphics.FromImage(dst);
|
||||
g.SmoothingMode = SmoothingMode.HighQuality;
|
||||
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||
|
||||
Rectangle r = new Rectangle(0, 0, width, height);
|
||||
|
||||
g.DrawImage(bmp, r);
|
||||
|
||||
return dst;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
673
src/BuildUtil/CoreUtil/Buf.cs
Normal file
673
src/BuildUtil/CoreUtil/Buf.cs
Normal file
@ -0,0 +1,673 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Web.Mail;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
// FIFO
|
||||
public class Fifo
|
||||
{
|
||||
byte[] p;
|
||||
int pos, size;
|
||||
public int Size
|
||||
{
|
||||
get { return size; }
|
||||
}
|
||||
public byte[] Data
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.p;
|
||||
}
|
||||
}
|
||||
public int DataOffset
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.pos;
|
||||
}
|
||||
}
|
||||
public int PhysicalSize
|
||||
{
|
||||
get
|
||||
{
|
||||
return p.Length;
|
||||
}
|
||||
}
|
||||
|
||||
int reallocMemSize;
|
||||
public const int FifoInitMemSize = 4096;
|
||||
public const int FifoReallocMemSize = 65536;
|
||||
public const int FifoReallocMemSizeSmall = 65536;
|
||||
|
||||
long totalWriteSize = 0, totalReadSize = 0;
|
||||
|
||||
public long TotalReadSize
|
||||
{
|
||||
get { return totalReadSize; }
|
||||
}
|
||||
public long TotalWriteSize
|
||||
{
|
||||
get { return totalWriteSize; }
|
||||
}
|
||||
|
||||
public Fifo()
|
||||
{
|
||||
init(0);
|
||||
}
|
||||
public Fifo(int reallocMemSize)
|
||||
{
|
||||
init(reallocMemSize);
|
||||
}
|
||||
|
||||
void init(int reallocMemSize)
|
||||
{
|
||||
if (reallocMemSize == 0)
|
||||
{
|
||||
reallocMemSize = FifoReallocMemSize;
|
||||
}
|
||||
|
||||
this.size = this.pos = 0;
|
||||
this.reallocMemSize = reallocMemSize;
|
||||
|
||||
this.p = new byte[FifoInitMemSize];
|
||||
}
|
||||
|
||||
public void Write(Buf buf)
|
||||
{
|
||||
Write(buf.ByteData);
|
||||
}
|
||||
public void Write(byte[] src)
|
||||
{
|
||||
Write(src, src.Length);
|
||||
}
|
||||
public void SkipWrite(int size)
|
||||
{
|
||||
Write(null, size);
|
||||
}
|
||||
public void Write(byte[] src, int size)
|
||||
{
|
||||
Write(src, 0, size);
|
||||
}
|
||||
public void Write(byte[] src, int offset, int size)
|
||||
{
|
||||
int i, need_size;
|
||||
bool realloc_flag;
|
||||
|
||||
i = this.size;
|
||||
this.size += size;
|
||||
need_size = this.pos + this.size;
|
||||
realloc_flag = false;
|
||||
|
||||
int memsize = p.Length;
|
||||
while (need_size > memsize)
|
||||
{
|
||||
memsize = Math.Max(memsize, FifoInitMemSize) * 3;
|
||||
realloc_flag = true;
|
||||
}
|
||||
|
||||
if (realloc_flag)
|
||||
{
|
||||
byte[] new_p = new byte[memsize];
|
||||
Util.CopyByte(new_p, 0, this.p, 0, this.p.Length);
|
||||
this.p = new_p;
|
||||
}
|
||||
|
||||
if (src != null)
|
||||
{
|
||||
Util.CopyByte(this.p, this.pos + i, src, offset, size);
|
||||
}
|
||||
|
||||
totalWriteSize += size;
|
||||
}
|
||||
|
||||
public byte[] Read()
|
||||
{
|
||||
return Read(this.Size);
|
||||
}
|
||||
public void ReadToBuf(Buf buf, int size)
|
||||
{
|
||||
byte[] data = Read(size);
|
||||
|
||||
buf.Write(data);
|
||||
}
|
||||
public Buf ReadToBuf(int size)
|
||||
{
|
||||
byte[] data = Read(size);
|
||||
|
||||
return new Buf(data);
|
||||
}
|
||||
public byte[] Read(int size)
|
||||
{
|
||||
byte[] ret = new byte[size];
|
||||
int read_size = Read(ret);
|
||||
Array.Resize<byte>(ref ret, read_size);
|
||||
|
||||
return ret;
|
||||
}
|
||||
public int Read(byte[] dst)
|
||||
{
|
||||
return Read(dst, dst.Length);
|
||||
}
|
||||
public int SkipRead(int size)
|
||||
{
|
||||
return Read(null, size);
|
||||
}
|
||||
public int Read(byte[] dst, int size)
|
||||
{
|
||||
return Read(dst, 0, size);
|
||||
}
|
||||
public int Read(byte[] dst, int offset, int size)
|
||||
{
|
||||
int read_size;
|
||||
|
||||
read_size = Math.Min(size, this.size);
|
||||
if (read_size == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (dst != null)
|
||||
{
|
||||
Util.CopyByte(dst, offset, this.p, this.pos, size);
|
||||
}
|
||||
this.pos += read_size;
|
||||
this.size -= read_size;
|
||||
|
||||
if (this.size == 0)
|
||||
{
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
if (this.pos >= FifoInitMemSize &&
|
||||
this.p.Length >= this.reallocMemSize &&
|
||||
(this.p.Length / 2) > this.size)
|
||||
{
|
||||
byte[] new_p;
|
||||
int new_size;
|
||||
|
||||
new_size = Math.Max(this.p.Length / 2, FifoInitMemSize);
|
||||
new_p = new byte[new_size];
|
||||
Util.CopyByte(new_p, 0, this.p, this.pos, this.size);
|
||||
|
||||
this.p = new_p;
|
||||
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
totalReadSize += read_size;
|
||||
|
||||
return read_size;
|
||||
}
|
||||
}
|
||||
|
||||
public class Buf
|
||||
{
|
||||
MemoryStream buf;
|
||||
|
||||
public Buf()
|
||||
{
|
||||
init(new byte[0]);
|
||||
}
|
||||
public Buf(byte[] data)
|
||||
{
|
||||
init(data);
|
||||
}
|
||||
void init(byte[] data)
|
||||
{
|
||||
buf = new MemoryStream();
|
||||
Write(data);
|
||||
SeekToBegin();
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
buf.SetLength(0);
|
||||
}
|
||||
|
||||
public void WriteByte(byte data)
|
||||
{
|
||||
byte[] a = new byte[1] { data };
|
||||
|
||||
Write(a);
|
||||
}
|
||||
public void Write(byte[] data)
|
||||
{
|
||||
buf.Write(data, 0, data.Length);
|
||||
}
|
||||
public void Write(byte[] data, int pos, int len)
|
||||
{
|
||||
buf.Write(data, pos, len);
|
||||
}
|
||||
|
||||
public uint Size
|
||||
{
|
||||
get
|
||||
{
|
||||
return (uint)buf.Length;
|
||||
}
|
||||
}
|
||||
|
||||
public uint Pos
|
||||
{
|
||||
get
|
||||
{
|
||||
return (uint)buf.Position;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] ByteData
|
||||
{
|
||||
get
|
||||
{
|
||||
return buf.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
public byte this[uint i]
|
||||
{
|
||||
get
|
||||
{
|
||||
return buf.GetBuffer()[i];
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
buf.GetBuffer()[i] = value;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] Read()
|
||||
{
|
||||
return Read(this.Size);
|
||||
}
|
||||
public byte[] Read(uint size)
|
||||
{
|
||||
byte[] tmp = new byte[size];
|
||||
int i = buf.Read(tmp, 0, (int)size);
|
||||
|
||||
byte[] ret = new byte[i];
|
||||
Array.Copy(tmp, 0, ret, 0, i);
|
||||
|
||||
return ret;
|
||||
}
|
||||
public byte ReadByte()
|
||||
{
|
||||
byte[] a = Read(1);
|
||||
|
||||
return a[0];
|
||||
}
|
||||
|
||||
public void SeekToBegin()
|
||||
{
|
||||
Seek(0);
|
||||
}
|
||||
public void SeekToEnd()
|
||||
{
|
||||
Seek(0, SeekOrigin.End);
|
||||
}
|
||||
public void Seek(uint offset)
|
||||
{
|
||||
Seek(offset, SeekOrigin.Begin);
|
||||
}
|
||||
public void Seek(uint offset, SeekOrigin mode)
|
||||
{
|
||||
buf.Seek(offset, mode);
|
||||
}
|
||||
|
||||
public ushort ReadShort()
|
||||
{
|
||||
byte[] data = Read(2);
|
||||
if (data.Length != 2)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (Env.IsLittleEndian)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
}
|
||||
return BitConverter.ToUInt16(data, 0);
|
||||
}
|
||||
public ushort RawReadShort()
|
||||
{
|
||||
byte[] data = Read(2);
|
||||
if (data.Length != 2)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return BitConverter.ToUInt16(data, 0);
|
||||
}
|
||||
|
||||
public uint ReadInt()
|
||||
{
|
||||
byte[] data = Read(4);
|
||||
if (data.Length != 4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (Env.IsLittleEndian)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
}
|
||||
return BitConverter.ToUInt32(data, 0);
|
||||
}
|
||||
public uint RawReadInt()
|
||||
{
|
||||
byte[] data = Read(4);
|
||||
if (data.Length != 4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return BitConverter.ToUInt32(data, 0);
|
||||
}
|
||||
|
||||
public ulong ReadInt64()
|
||||
{
|
||||
byte[] data = Read(8);
|
||||
if (data.Length != 8)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (Env.IsLittleEndian)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
}
|
||||
return BitConverter.ToUInt64(data, 0);
|
||||
}
|
||||
public ulong RawReadInt64()
|
||||
{
|
||||
byte[] data = Read(8);
|
||||
if (data.Length != 8)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return BitConverter.ToUInt64(data, 0);
|
||||
}
|
||||
|
||||
public string ReadStr()
|
||||
{
|
||||
return ReadStr(false);
|
||||
}
|
||||
public string ReadStr(bool include_null)
|
||||
{
|
||||
uint len = ReadInt();
|
||||
byte[] data = Read(len - (uint)(include_null ? 1 : 0));
|
||||
return Str.ShiftJisEncoding.GetString(data);
|
||||
}
|
||||
|
||||
public string ReadUniStr()
|
||||
{
|
||||
return ReadUniStr(false);
|
||||
}
|
||||
public string ReadUniStr(bool include_null)
|
||||
{
|
||||
uint len = ReadInt();
|
||||
if (len == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
byte[] data = Read(len - (uint)(include_null ? 2 : 0));
|
||||
return Str.Utf8Encoding.GetString(data);
|
||||
}
|
||||
public void WriteShort(ushort shortValue)
|
||||
{
|
||||
byte[] data = BitConverter.GetBytes(shortValue);
|
||||
if (Env.IsLittleEndian)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
}
|
||||
Write(data);
|
||||
}
|
||||
public void RawWriteShort(ushort shortValue)
|
||||
{
|
||||
byte[] data = BitConverter.GetBytes(shortValue);
|
||||
Write(data);
|
||||
}
|
||||
|
||||
public void WriteInt(uint intValue)
|
||||
{
|
||||
byte[] data = BitConverter.GetBytes(intValue);
|
||||
if (Env.IsLittleEndian)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
}
|
||||
Write(data);
|
||||
}
|
||||
public void RawWriteInt(uint intValue)
|
||||
{
|
||||
byte[] data = BitConverter.GetBytes(intValue);
|
||||
Write(data);
|
||||
}
|
||||
|
||||
public void WriteInt64(ulong int64Value)
|
||||
{
|
||||
byte[] data = BitConverter.GetBytes(int64Value);
|
||||
if (Env.IsLittleEndian)
|
||||
{
|
||||
Array.Reverse(data);
|
||||
}
|
||||
Write(data);
|
||||
}
|
||||
public void RawWriteInt64(ulong int64Value)
|
||||
{
|
||||
byte[] data = BitConverter.GetBytes(int64Value);
|
||||
Write(data);
|
||||
}
|
||||
|
||||
public string ReadNextLineAsString()
|
||||
{
|
||||
return ReadNextLineAsString(Str.Utf8Encoding);
|
||||
}
|
||||
public string ReadNextLineAsString(Encoding encoding)
|
||||
{
|
||||
byte[] ret = ReadNextLineAsData();
|
||||
if (ret == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return encoding.GetString(ret);
|
||||
}
|
||||
|
||||
public byte[] ReadNextLineAsData()
|
||||
{
|
||||
if (this.Size <= this.Pos)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
long pos = buf.Position;
|
||||
|
||||
long i;
|
||||
byte[] tmp = new byte[1];
|
||||
for (i = pos; i < buf.Length; i++)
|
||||
{
|
||||
buf.Read(tmp, 0, 1);
|
||||
|
||||
if (tmp[0] == 13 || tmp[0] == 10)
|
||||
{
|
||||
if (tmp[0] == 13)
|
||||
{
|
||||
if ((i + 2) < buf.Length)
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
long len = i - pos;
|
||||
|
||||
buf.Position = pos;
|
||||
|
||||
byte[] ret = Read((uint)((int)len));
|
||||
|
||||
try
|
||||
{
|
||||
Seek(1, SeekOrigin.Current);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
if (ret.Length >= 1 && ret[ret.Length - 1] == 13)
|
||||
{
|
||||
Array.Resize<byte>(ref ret, ret.Length - 1);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void WriteStr(string strValue)
|
||||
{
|
||||
WriteStr(strValue, false);
|
||||
}
|
||||
public void WriteStr(string strValue, bool include_null)
|
||||
{
|
||||
byte[] data = Str.ShiftJisEncoding.GetBytes(strValue);
|
||||
WriteInt((uint)data.Length + (uint)(include_null ? 1 : 0));
|
||||
Write(data);
|
||||
}
|
||||
|
||||
public void WriteUniStr(string strValue)
|
||||
{
|
||||
WriteUniStr(strValue, false);
|
||||
}
|
||||
public void WriteUniStr(string strValue, bool include_null)
|
||||
{
|
||||
byte[] data = Str.Utf8Encoding.GetBytes(strValue);
|
||||
WriteInt((uint)data.Length + (uint)(include_null ? 2 : 0));
|
||||
Write(data);
|
||||
}
|
||||
|
||||
public static Buf ReadFromFile(string filename)
|
||||
{
|
||||
return new Buf(IO.ReadFile(filename));
|
||||
}
|
||||
|
||||
public void WriteToFile(string filename)
|
||||
{
|
||||
IO.SaveFile(filename, this.ByteData);
|
||||
}
|
||||
|
||||
public static Buf ReadFromStream(Stream st)
|
||||
{
|
||||
Buf ret = new Buf();
|
||||
int size = 32767;
|
||||
|
||||
while (true)
|
||||
{
|
||||
byte[] tmp = new byte[size];
|
||||
int i = st.Read(tmp, 0, tmp.Length);
|
||||
|
||||
if (i <= 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Array.Resize<byte>(ref tmp, i);
|
||||
|
||||
ret.Write(tmp);
|
||||
}
|
||||
|
||||
ret.SeekToBegin();
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
320
src/BuildUtil/CoreUtil/Cache.cs
Normal file
320
src/BuildUtil/CoreUtil/Cache.cs
Normal file
@ -0,0 +1,320 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public enum CacheType
|
||||
{
|
||||
UpdateExpiresWhenAccess = 0,
|
||||
DoNotUpdateExpiresWhenAccess = 1,
|
||||
}
|
||||
|
||||
public class Cache<TKey, TValue>
|
||||
{
|
||||
class Entry
|
||||
{
|
||||
DateTime createdDateTime;
|
||||
public DateTime CreatedDateTime
|
||||
{
|
||||
get { return createdDateTime; }
|
||||
}
|
||||
DateTime updatedDateTime;
|
||||
public DateTime UpdatedDateTime
|
||||
{
|
||||
get { return updatedDateTime; }
|
||||
}
|
||||
DateTime lastAccessedDateTime;
|
||||
public DateTime LastAccessedDateTime
|
||||
{
|
||||
get { return lastAccessedDateTime; }
|
||||
}
|
||||
|
||||
TKey key;
|
||||
public TKey Key
|
||||
{
|
||||
get
|
||||
{
|
||||
return key;
|
||||
}
|
||||
}
|
||||
|
||||
TValue value;
|
||||
public TValue Value
|
||||
{
|
||||
get
|
||||
{
|
||||
lastAccessedDateTime = Time.NowDateTime;
|
||||
return this.value;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.value = value;
|
||||
updatedDateTime = Time.NowDateTime;
|
||||
lastAccessedDateTime = Time.NowDateTime;
|
||||
}
|
||||
}
|
||||
|
||||
public Entry(TKey key, TValue value)
|
||||
{
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
lastAccessedDateTime = updatedDateTime = createdDateTime = Time.NowDateTime;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return key.GetHashCode();
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return key.ToString() + "," + value.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public static readonly TimeSpan DefaultExpireSpan = new TimeSpan(0, 5, 0);
|
||||
public const CacheType DefaultCacheType = CacheType.UpdateExpiresWhenAccess;
|
||||
|
||||
TimeSpan expireSpan;
|
||||
public TimeSpan ExpireSpan
|
||||
{
|
||||
get { return expireSpan; }
|
||||
}
|
||||
CacheType type;
|
||||
public CacheType Type
|
||||
{
|
||||
get { return type; }
|
||||
}
|
||||
Dictionary<TKey, Entry> list;
|
||||
object lockObj;
|
||||
|
||||
public Cache()
|
||||
{
|
||||
init(DefaultExpireSpan, DefaultCacheType);
|
||||
}
|
||||
public Cache(CacheType type)
|
||||
{
|
||||
init(DefaultExpireSpan, type);
|
||||
}
|
||||
public Cache(TimeSpan expireSpan)
|
||||
{
|
||||
init(expireSpan, DefaultCacheType);
|
||||
}
|
||||
public Cache(TimeSpan expireSpan, CacheType type)
|
||||
{
|
||||
init(expireSpan, type);
|
||||
}
|
||||
void init(TimeSpan expireSpan, CacheType type)
|
||||
{
|
||||
this.expireSpan = expireSpan;
|
||||
this.type = type;
|
||||
|
||||
list = new Dictionary<TKey, Entry>();
|
||||
lockObj = new object();
|
||||
}
|
||||
|
||||
public void Add(TKey key, TValue value)
|
||||
{
|
||||
lock (lockObj)
|
||||
{
|
||||
Entry e;
|
||||
|
||||
deleteExpired();
|
||||
|
||||
if (list.ContainsKey(key) == false)
|
||||
{
|
||||
e = new Entry(key, value);
|
||||
|
||||
list.Add(e.Key, e);
|
||||
|
||||
deleteExpired();
|
||||
}
|
||||
else
|
||||
{
|
||||
e = list[key];
|
||||
e.Value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Delete(TKey key)
|
||||
{
|
||||
lock (lockObj)
|
||||
{
|
||||
if (list.ContainsKey(key))
|
||||
{
|
||||
list.Remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public TValue this[TKey key]
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (lockObj)
|
||||
{
|
||||
deleteExpired();
|
||||
|
||||
if (list.ContainsKey(key) == false)
|
||||
{
|
||||
return default(TValue);
|
||||
}
|
||||
|
||||
return list[key].Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static long last_deleted = 0;
|
||||
|
||||
void deleteExpired()
|
||||
{
|
||||
bool do_delete = false;
|
||||
long now = Tick64.Value;
|
||||
long delete_inveral = expireSpan.Milliseconds / 10;
|
||||
|
||||
lock (lockObj)
|
||||
{
|
||||
if (last_deleted == 0 || now > (last_deleted + delete_inveral))
|
||||
{
|
||||
last_deleted = now;
|
||||
do_delete = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (do_delete == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
lock (lockObj)
|
||||
{
|
||||
List<Entry> o = new List<Entry>();
|
||||
DateTime expire = Time.NowDateTime - this.expireSpan;
|
||||
|
||||
foreach (Entry e in list.Values)
|
||||
{
|
||||
if (this.type == CacheType.UpdateExpiresWhenAccess)
|
||||
{
|
||||
if (e.LastAccessedDateTime < expire)
|
||||
{
|
||||
o.Add(e);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (e.UpdatedDateTime < expire)
|
||||
{
|
||||
o.Add(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (Entry e in o)
|
||||
{
|
||||
list.Remove(e.Key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
182
src/BuildUtil/CoreUtil/Compress.cs
Normal file
182
src/BuildUtil/CoreUtil/Compress.cs
Normal file
@ -0,0 +1,182 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Web.Mail;
|
||||
using CoreUtil.Internal;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public static class ZLib
|
||||
{
|
||||
public static byte[] Compress(byte[] src)
|
||||
{
|
||||
return Compress(src, zlibConst.Z_DEFAULT_COMPRESSION);
|
||||
}
|
||||
public static byte[] Compress(byte[] src, int level)
|
||||
{
|
||||
return Compress(src, level, false);
|
||||
}
|
||||
public static byte[] Compress(byte[] src, int level, bool noHeader)
|
||||
{
|
||||
int dstSize = src.Length * 2 + 100;
|
||||
byte[] dst = new byte[dstSize];
|
||||
|
||||
compress2(ref dst, src, level, noHeader);
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
public static byte[] Uncompress(byte[] src, int originalSize)
|
||||
{
|
||||
byte[] dst = new byte[originalSize];
|
||||
|
||||
uncompress(ref dst, src);
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
static void compress2(ref byte[] dest, byte[] src, int level, bool noHeader)
|
||||
{
|
||||
ZStream stream = new ZStream();
|
||||
|
||||
stream.next_in = src;
|
||||
stream.avail_in = src.Length;
|
||||
|
||||
stream.next_out = dest;
|
||||
stream.avail_out = dest.Length;
|
||||
|
||||
if (noHeader == false)
|
||||
{
|
||||
stream.deflateInit(level);
|
||||
}
|
||||
else
|
||||
{
|
||||
stream.deflateInit(level, -15);
|
||||
}
|
||||
|
||||
stream.deflate(zlibConst.Z_FINISH);
|
||||
|
||||
Array.Resize<byte>(ref dest, (int)stream.total_out);
|
||||
}
|
||||
|
||||
static void uncompress(ref byte[] dest, byte[] src)
|
||||
{
|
||||
ZStream stream = new ZStream();
|
||||
|
||||
stream.next_in = src;
|
||||
stream.avail_in = src.Length;
|
||||
|
||||
stream.next_out = dest;
|
||||
stream.avail_out = dest.Length;
|
||||
|
||||
stream.inflateInit();
|
||||
|
||||
int err = stream.inflate(zlibConst.Z_FINISH);
|
||||
if (err != zlibConst.Z_STREAM_END)
|
||||
{
|
||||
stream.inflateEnd();
|
||||
throw new ApplicationException();
|
||||
}
|
||||
|
||||
Array.Resize<byte>(ref dest, (int)stream.total_out);
|
||||
|
||||
err = stream.inflateEnd();
|
||||
if (err != zlibConst.Z_OK)
|
||||
{
|
||||
throw new ApplicationException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
2180
src/BuildUtil/CoreUtil/Console.cs
Normal file
2180
src/BuildUtil/CoreUtil/Console.cs
Normal file
File diff suppressed because it is too large
Load Diff
497
src/BuildUtil/CoreUtil/Csv.cs
Normal file
497
src/BuildUtil/CoreUtil/Csv.cs
Normal file
@ -0,0 +1,497 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Web.Mail;
|
||||
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
class CsvTimeSpan
|
||||
{
|
||||
public DateTime StartDateTime;
|
||||
public DateTime EndDateTime;
|
||||
public int StartIndex;
|
||||
public int NumIndex;
|
||||
|
||||
public CsvTimeSpan(DateTime startDateTime, DateTime endDateTime, int startIndex, int numIndex)
|
||||
{
|
||||
StartDateTime = startDateTime;
|
||||
EndDateTime = endDateTime;
|
||||
StartIndex = startIndex;
|
||||
NumIndex = numIndex;
|
||||
}
|
||||
}
|
||||
|
||||
public class Csv
|
||||
{
|
||||
List<CsvEntry> entryList;
|
||||
Encoding encoding;
|
||||
static Encoding defaultEncoding = Str.ShiftJisEncoding;
|
||||
|
||||
public Encoding Encoding
|
||||
{
|
||||
get
|
||||
{
|
||||
return encoding;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.encoding = value;
|
||||
}
|
||||
}
|
||||
|
||||
public CsvEntry First
|
||||
{
|
||||
get
|
||||
{
|
||||
return entryList[0];
|
||||
}
|
||||
}
|
||||
|
||||
public CsvEntry Last
|
||||
{
|
||||
get
|
||||
{
|
||||
return entryList[entryList.Count - 1];
|
||||
}
|
||||
}
|
||||
|
||||
public Csv()
|
||||
: this(defaultEncoding)
|
||||
{
|
||||
}
|
||||
public Csv(Encoding encoding)
|
||||
{
|
||||
init(null, encoding);
|
||||
}
|
||||
|
||||
public Csv(string filename)
|
||||
: this(filename, defaultEncoding)
|
||||
{
|
||||
}
|
||||
public Csv(string filename, Encoding encoding)
|
||||
{
|
||||
init(Buf.ReadFromFile(filename), encoding);
|
||||
}
|
||||
|
||||
public Csv(Buf data)
|
||||
{
|
||||
byte[] src = data.ByteData;
|
||||
int bomSize;
|
||||
|
||||
Encoding enc = Str.CheckBOM(src, out bomSize);
|
||||
|
||||
if (bomSize >= 1)
|
||||
{
|
||||
src = Util.RemoveStartByteArray(src, bomSize);
|
||||
}
|
||||
|
||||
init(new Buf(src), enc);
|
||||
}
|
||||
public Csv(Buf data, Encoding encoding)
|
||||
{
|
||||
init(data, encoding);
|
||||
}
|
||||
|
||||
void init(Buf data, Encoding encoding)
|
||||
{
|
||||
if (encoding == null)
|
||||
{
|
||||
encoding = defaultEncoding;
|
||||
}
|
||||
|
||||
int bomSize = 0;
|
||||
Encoding enc2 = null;
|
||||
if (data != null)
|
||||
{
|
||||
enc2 = Str.CheckBOM(data.ByteData, out bomSize);
|
||||
}
|
||||
if (bomSize >= 1)
|
||||
{
|
||||
data = new Buf(Util.RemoveStartByteArray(data.ByteData, bomSize));
|
||||
}
|
||||
if (enc2 != null)
|
||||
{
|
||||
encoding = enc2;
|
||||
}
|
||||
this.encoding = encoding;
|
||||
|
||||
entryList = new List<CsvEntry>();
|
||||
|
||||
if (data != null)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream(data.ByteData);
|
||||
StreamReader sr = new StreamReader(ms, this.encoding);
|
||||
|
||||
while (true)
|
||||
{
|
||||
string s = sr.ReadLine();
|
||||
|
||||
if (s == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
char[] sep = { ',' };
|
||||
string[] strings = s.Trim().Split(sep, StringSplitOptions.None);
|
||||
|
||||
CsvEntry e = new CsvEntry(strings);
|
||||
Add(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
StringBuilder b = new StringBuilder();
|
||||
|
||||
foreach (CsvEntry e in entryList)
|
||||
{
|
||||
b.AppendLine(e.ToString());
|
||||
}
|
||||
|
||||
return b.ToString();
|
||||
}
|
||||
|
||||
public Buf ToBuf()
|
||||
{
|
||||
string s = ToString();
|
||||
|
||||
Buf b = new Buf();
|
||||
|
||||
byte[] bom = Str.GetBOM(this.Encoding);
|
||||
|
||||
if (bom != null)
|
||||
{
|
||||
b.Write(bom);
|
||||
}
|
||||
|
||||
b.Write(encoding.GetBytes(s));
|
||||
|
||||
b.SeekToBegin();
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
public void SaveToFile(string filename)
|
||||
{
|
||||
File.WriteAllBytes(filename, ToBuf().ByteData);
|
||||
}
|
||||
|
||||
public void Add(CsvEntry e)
|
||||
{
|
||||
entryList.Add(e);
|
||||
}
|
||||
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
return entryList.Count;
|
||||
}
|
||||
}
|
||||
|
||||
public CsvEntry this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return entryList[index];
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable Items
|
||||
{
|
||||
get
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < entryList.Count; i++)
|
||||
{
|
||||
yield return entryList[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CsvCompare csvCompareMethod;
|
||||
int csvCompareIndex;
|
||||
Type csvCompareType;
|
||||
bool csvCompareReverse;
|
||||
|
||||
int sortInternal(CsvEntry e1, CsvEntry e2)
|
||||
{
|
||||
if (csvCompareMethod != null)
|
||||
{
|
||||
object o1 = e1.Convert(csvCompareType, csvCompareIndex);
|
||||
object o2 = e2.Convert(csvCompareType, csvCompareIndex);
|
||||
|
||||
return csvCompareMethod(o1, o2) * (csvCompareReverse ? -1 : 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
IComparable o1 = (IComparable)e1.Convert(csvCompareType, csvCompareIndex);
|
||||
IComparable o2 = (IComparable)e2.Convert(csvCompareType, csvCompareIndex);
|
||||
|
||||
return o1.CompareTo(o2) * (csvCompareReverse ? -1 : 1);
|
||||
}
|
||||
}
|
||||
|
||||
public void Sort(Type type)
|
||||
{
|
||||
Sort(null, type);
|
||||
}
|
||||
public void Sort(CsvCompare cmp, Type type)
|
||||
{
|
||||
Sort(cmp, type, false);
|
||||
}
|
||||
public void Sort(Type type, bool reverse)
|
||||
{
|
||||
Sort(null, type, reverse);
|
||||
}
|
||||
public void Sort(CsvCompare cmp, Type type, bool reverse)
|
||||
{
|
||||
Sort(cmp, 0, type, reverse);
|
||||
}
|
||||
public void Sort(int index, Type type)
|
||||
{
|
||||
Sort(null, index, type);
|
||||
}
|
||||
public void Sort(CsvCompare cmp, int index, Type type)
|
||||
{
|
||||
Sort(cmp, 0, type, false);
|
||||
}
|
||||
public void Sort(int index, Type type, bool reverse)
|
||||
{
|
||||
Sort(null, index, type, reverse);
|
||||
}
|
||||
public void Sort(CsvCompare cmp, int index, Type type, bool reverse)
|
||||
{
|
||||
csvCompareMethod = cmp;
|
||||
csvCompareIndex = index;
|
||||
csvCompareType = type;
|
||||
csvCompareReverse = reverse;
|
||||
|
||||
entryList.Sort(new Comparison<CsvEntry>(sortInternal));
|
||||
}
|
||||
|
||||
public static int CompareString(object o1, object o2)
|
||||
{
|
||||
string s1 = (string)o1;
|
||||
string s2 = (string)o2;
|
||||
return s1.CompareTo(s2);
|
||||
}
|
||||
|
||||
public static int CompareDatetime(object o1, object o2)
|
||||
{
|
||||
DateTime d1 = (DateTime)o1;
|
||||
DateTime d2 = (DateTime)o2;
|
||||
|
||||
return d1.CompareTo(d2);
|
||||
}
|
||||
|
||||
public void SetEncoding(Encoding e)
|
||||
{
|
||||
this.encoding = e;
|
||||
}
|
||||
|
||||
public Csv Clone()
|
||||
{
|
||||
Csv csv = new Csv(this.encoding);
|
||||
|
||||
foreach (CsvEntry e in entryList)
|
||||
{
|
||||
csv.Add(e.Clone());
|
||||
}
|
||||
|
||||
return csv;
|
||||
}
|
||||
}
|
||||
|
||||
public delegate int CsvCompare(object o1, object o2);
|
||||
|
||||
public class CsvEntry
|
||||
{
|
||||
List<string> strings;
|
||||
|
||||
public CsvEntry Clone()
|
||||
{
|
||||
string[] array = (string[])strings.ToArray().Clone();
|
||||
|
||||
CsvEntry e = new CsvEntry(array);
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
public CsvEntry(params string[] elements)
|
||||
{
|
||||
strings = new List<string>();
|
||||
foreach (string s in elements)
|
||||
{
|
||||
string str = s;
|
||||
|
||||
if (str.StartsWith("\"") && str.EndsWith("\"") && str.Length >= 2)
|
||||
{
|
||||
str = str.Substring(1, str.Length - 2);
|
||||
}
|
||||
|
||||
strings.Add(str);
|
||||
}
|
||||
}
|
||||
|
||||
public string this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return strings[index];
|
||||
}
|
||||
}
|
||||
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
return strings.Count;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
int i, num;
|
||||
string ret = "";
|
||||
|
||||
num = strings.Count;
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
string s = strings[i];
|
||||
|
||||
s = Str.ReplaceStr(s, ",", ".", false);
|
||||
s = Str.ReplaceStr(s, "\r\n", " ", false);
|
||||
s = Str.ReplaceStr(s, "\r", " ", false);
|
||||
s = Str.ReplaceStr(s, "\n", " ", false);
|
||||
|
||||
ret += s;
|
||||
|
||||
if ((i + 1) < num)
|
||||
{
|
||||
ret += ",";
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Type lastType = null;
|
||||
object lastObject = null;
|
||||
int lastIndex = -1;
|
||||
|
||||
public object Convert(Type type, int index)
|
||||
{
|
||||
if (lastType == type && lastIndex == index)
|
||||
{
|
||||
return lastObject;
|
||||
}
|
||||
|
||||
lastType = type;
|
||||
lastIndex = index;
|
||||
lastObject = System.Convert.ChangeType(strings[index], type);
|
||||
|
||||
return lastObject;
|
||||
}
|
||||
|
||||
public DateTime ToDateTime(int index)
|
||||
{
|
||||
return (DateTime)Convert(typeof(DateTime), index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
572
src/BuildUtil/CoreUtil/Env.cs
Normal file
572
src/BuildUtil/CoreUtil/Env.cs
Normal file
@ -0,0 +1,572 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Mail;
|
||||
using System.Net.Mime;
|
||||
using System.Reflection;
|
||||
using CoreUtil;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public static class Env
|
||||
{
|
||||
static object lockObj = new object();
|
||||
static bool inited = false;
|
||||
|
||||
static Env()
|
||||
{
|
||||
initCache();
|
||||
}
|
||||
|
||||
static void initCache()
|
||||
{
|
||||
lock (lockObj)
|
||||
{
|
||||
if (inited == false)
|
||||
{
|
||||
initValues();
|
||||
inited = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static string homeDir;
|
||||
static public string HomeDir
|
||||
{
|
||||
get { return homeDir; }
|
||||
}
|
||||
static string exeFileName;
|
||||
static public string ExeFileName
|
||||
{
|
||||
get { return exeFileName; }
|
||||
}
|
||||
static string exeFileDir;
|
||||
static public string ExeFileDir
|
||||
{
|
||||
get { return exeFileDir; }
|
||||
}
|
||||
static string windowsDir;
|
||||
static public string WindowsDir
|
||||
{
|
||||
get { return windowsDir; }
|
||||
}
|
||||
static string systemDir;
|
||||
static public string SystemDir
|
||||
{
|
||||
get { return systemDir; }
|
||||
}
|
||||
static string tempDir;
|
||||
static public string TempDir
|
||||
{
|
||||
get { return tempDir; }
|
||||
}
|
||||
static string winTempDir;
|
||||
static public string WinTempDir
|
||||
{
|
||||
get { return winTempDir; }
|
||||
}
|
||||
static string windowsDrive;
|
||||
static public string WindowsDrive
|
||||
{
|
||||
get { return windowsDrive; }
|
||||
}
|
||||
static string programFilesDir;
|
||||
static public string ProgramFilesDir
|
||||
{
|
||||
get { return programFilesDir; }
|
||||
}
|
||||
static string personalStartMenuDir;
|
||||
static public string PersonalStartMenuDir
|
||||
{
|
||||
get { return personalStartMenuDir; }
|
||||
}
|
||||
static string personalProgramsDir;
|
||||
static public string PersonalProgramsDir
|
||||
{
|
||||
get { return personalProgramsDir; }
|
||||
}
|
||||
static string personalStartupDir;
|
||||
static public string PersonalStartupDir
|
||||
{
|
||||
get { return personalStartupDir; }
|
||||
}
|
||||
static string personalAppDataDir;
|
||||
static public string PersonalAppDataDir
|
||||
{
|
||||
get { return personalAppDataDir; }
|
||||
}
|
||||
static string personalDesktopDir;
|
||||
static public string PersonalDesktopDir
|
||||
{
|
||||
get { return personalDesktopDir; }
|
||||
}
|
||||
static string myDocumentsDir;
|
||||
static public string MyDocumentsDir
|
||||
{
|
||||
get { return myDocumentsDir; }
|
||||
}
|
||||
static string localAppDataDir;
|
||||
static public string LocalAppDataDir
|
||||
{
|
||||
get { return localAppDataDir; }
|
||||
}
|
||||
static string userName;
|
||||
static public string UserName
|
||||
{
|
||||
get { return userName; }
|
||||
}
|
||||
static string userNameEx;
|
||||
static public string UserNameEx
|
||||
{
|
||||
get { return userNameEx; }
|
||||
}
|
||||
static string machineName;
|
||||
static public string MachineName
|
||||
{
|
||||
get { return machineName; }
|
||||
}
|
||||
static string commandLine;
|
||||
public static string CommandLine
|
||||
{
|
||||
get { return commandLine; }
|
||||
}
|
||||
public static StrToken CommandLineList
|
||||
{
|
||||
get
|
||||
{
|
||||
return new StrToken(CommandLine);
|
||||
}
|
||||
}
|
||||
static OperatingSystem osInfo;
|
||||
public static OperatingSystem OsInfo
|
||||
{
|
||||
get { return osInfo; }
|
||||
}
|
||||
static bool isNt;
|
||||
public static bool IsNt
|
||||
{
|
||||
get { return isNt; }
|
||||
}
|
||||
static bool is9x;
|
||||
public static bool Is9x
|
||||
{
|
||||
get { return is9x; }
|
||||
}
|
||||
static bool isCe;
|
||||
public static bool IsCe
|
||||
{
|
||||
get { return isCe; }
|
||||
}
|
||||
static bool isLittleEndian;
|
||||
public static bool IsLittleEndian
|
||||
{
|
||||
get { return Env.isLittleEndian; }
|
||||
}
|
||||
public static bool IsBigEndian
|
||||
{
|
||||
get { return !IsLittleEndian; }
|
||||
}
|
||||
static bool isAdmin;
|
||||
public static bool IsAdmin
|
||||
{
|
||||
get { return Env.isAdmin; }
|
||||
}
|
||||
static int processId;
|
||||
public static int ProcessId
|
||||
{
|
||||
get { return Env.processId; }
|
||||
}
|
||||
static string myTempDir;
|
||||
public static string MyTempDir
|
||||
{
|
||||
get { return myTempDir; }
|
||||
}
|
||||
static IO lockFile;
|
||||
|
||||
public static bool Is64BitProcess
|
||||
{
|
||||
get
|
||||
{
|
||||
return (IntPtr.Size == 8);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool Is64BitWindows
|
||||
{
|
||||
get
|
||||
{
|
||||
return Is64BitProcess || Kernel.InternalCheckIsWow64();
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsWow64
|
||||
{
|
||||
get
|
||||
{
|
||||
return Kernel.InternalCheckIsWow64();
|
||||
}
|
||||
}
|
||||
|
||||
static void initValues()
|
||||
{
|
||||
exeFileName = IO.RemoteLastEnMark(getMyExeFileName());
|
||||
if (Str.IsEmptyStr(exeFileName) == false)
|
||||
{
|
||||
exeFileDir = IO.RemoteLastEnMark(Path.GetDirectoryName(exeFileName));
|
||||
}
|
||||
else
|
||||
{
|
||||
exeFileDir = "";
|
||||
}
|
||||
homeDir = IO.RemoteLastEnMark(Kernel.GetEnvStr("HOME"));
|
||||
if (Str.IsEmptyStr(homeDir))
|
||||
{
|
||||
homeDir = IO.RemoteLastEnMark(Kernel.GetEnvStr("HOMEDRIVE") + Kernel.GetEnvStr("HOMEPATH"));
|
||||
}
|
||||
if (Str.IsEmptyStr(homeDir))
|
||||
{
|
||||
homeDir = CurrentDir;
|
||||
}
|
||||
systemDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.System));
|
||||
windowsDir = IO.RemoteLastEnMark(Path.GetDirectoryName(systemDir));
|
||||
tempDir = IO.RemoteLastEnMark(Path.GetTempPath());
|
||||
winTempDir = IO.RemoteLastEnMark(Path.Combine(windowsDir, "Temp"));
|
||||
IO.MakeDir(winTempDir);
|
||||
if (windowsDir.Length >= 2 && windowsDir[1] == ':')
|
||||
{
|
||||
windowsDrive = windowsDir.Substring(0, 2).ToUpper();
|
||||
}
|
||||
else
|
||||
{
|
||||
windowsDrive = "C:";
|
||||
}
|
||||
programFilesDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles));
|
||||
personalStartMenuDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu));
|
||||
personalProgramsDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.Programs));
|
||||
personalStartupDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.Startup));
|
||||
personalAppDataDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
|
||||
personalDesktopDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
|
||||
myDocumentsDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
|
||||
localAppDataDir = IO.RemoteLastEnMark(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
|
||||
userName = Environment.UserName;
|
||||
try
|
||||
{
|
||||
userNameEx = Environment.UserDomainName + "\\" + userName;
|
||||
}
|
||||
catch
|
||||
{
|
||||
userNameEx = userName;
|
||||
}
|
||||
machineName = Environment.MachineName;
|
||||
commandLine = initCommandLine(Environment.CommandLine);
|
||||
osInfo = Environment.OSVersion;
|
||||
isNt = (osInfo.Platform == PlatformID.Win32NT);
|
||||
isCe = (osInfo.Platform == PlatformID.WinCE);
|
||||
is9x = !(isNt || isCe);
|
||||
isLittleEndian = BitConverter.IsLittleEndian;
|
||||
processId = System.Diagnostics.Process.GetCurrentProcess().Id;
|
||||
isAdmin = checkIsAdmin();
|
||||
initMyTempDir();
|
||||
}
|
||||
|
||||
static void deleteUnusedTempDir()
|
||||
{
|
||||
DirEntry[] files;
|
||||
|
||||
files = IO.EnumDir(Env.tempDir);
|
||||
|
||||
foreach (DirEntry e in files)
|
||||
{
|
||||
if (e.IsFolder)
|
||||
{
|
||||
if (e.FileName.StartsWith("NET_", StringComparison.CurrentCultureIgnoreCase) && e.FileName.Length == 8)
|
||||
{
|
||||
string dirFullName = Path.Combine(Env.tempDir, e.fileName);
|
||||
string lockFileName = Path.Combine(dirFullName, "LockFile.dat");
|
||||
bool deleteNow = false;
|
||||
|
||||
try
|
||||
{
|
||||
IO io = IO.FileOpen(lockFileName);
|
||||
io.Close();
|
||||
|
||||
try
|
||||
{
|
||||
io = IO.FileOpen(lockFileName, true);
|
||||
deleteNow = true;
|
||||
io.Close();
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
DirEntry[] files2;
|
||||
|
||||
deleteNow = true;
|
||||
|
||||
try
|
||||
{
|
||||
files2 = IO.EnumDir(dirFullName);
|
||||
|
||||
foreach (DirEntry e2 in files2)
|
||||
{
|
||||
if (e2.IsFolder == false)
|
||||
{
|
||||
string fullPath = Path.Combine(dirFullName, e2.fileName);
|
||||
|
||||
try
|
||||
{
|
||||
IO io2 = IO.FileOpen(fullPath, true);
|
||||
io2.Close();
|
||||
}
|
||||
catch
|
||||
{
|
||||
deleteNow = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
deleteNow = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (deleteNow)
|
||||
{
|
||||
IO.DeleteDir(dirFullName, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void initMyTempDir()
|
||||
{
|
||||
try
|
||||
{
|
||||
deleteUnusedTempDir();
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
int num = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
byte[] rand = Secure.Rand(2);
|
||||
string tmp2 = Str.ByteToStr(rand);
|
||||
|
||||
string tmp = Path.Combine(Env.tempDir, "NET_" + tmp2);
|
||||
|
||||
if (IO.IsDirExists(tmp) == false && IO.MakeDir(tmp))
|
||||
{
|
||||
Env.myTempDir = tmp;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if ((num++) >= 100)
|
||||
{
|
||||
throw new SystemException();
|
||||
}
|
||||
}
|
||||
|
||||
string lockFileName = Path.Combine(Env.myTempDir, "LockFile.dat");
|
||||
lockFile = IO.FileCreate(lockFileName);
|
||||
}
|
||||
|
||||
static bool checkIsAdmin()
|
||||
{
|
||||
try
|
||||
{
|
||||
string name = "Vpn_Check_Admin_Key_NET_" + processId.ToString();
|
||||
string teststr = Str.GenRandStr();
|
||||
|
||||
if (Reg.WriteStr(RegRoot.LocalMachine, "", name, teststr) == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
string ret = Reg.ReadStr(RegRoot.LocalMachine, "", name);
|
||||
|
||||
if (ret == teststr)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Reg.DeleteValue(RegRoot.LocalMachine, "", name);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static string initCommandLine(string src)
|
||||
{
|
||||
try
|
||||
{
|
||||
int i;
|
||||
if (src.Length >= 1 && src[0] == '\"')
|
||||
{
|
||||
i = src.IndexOf('\"', 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
i = src.IndexOf(' ');
|
||||
}
|
||||
|
||||
if (i == -1)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
else
|
||||
{
|
||||
return src.Substring(i + 1).TrimStart(' ');
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
static string getMyExeFileName()
|
||||
{
|
||||
try
|
||||
{
|
||||
Assembly mainAssembly = Assembly.GetEntryAssembly();
|
||||
Module[] modules = mainAssembly.GetModules();
|
||||
return modules[0].FullyQualifiedName;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
static public string CurrentDir
|
||||
{
|
||||
get
|
||||
{
|
||||
return IO.RemoteLastEnMark(Environment.CurrentDirectory);
|
||||
}
|
||||
}
|
||||
static public string NewLine
|
||||
{
|
||||
get
|
||||
{
|
||||
return Environment.NewLine;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
1702
src/BuildUtil/CoreUtil/FileIO.cs
Normal file
1702
src/BuildUtil/CoreUtil/FileIO.cs
Normal file
File diff suppressed because it is too large
Load Diff
233
src/BuildUtil/CoreUtil/GZip.cs
Normal file
233
src/BuildUtil/CoreUtil/GZip.cs
Normal file
@ -0,0 +1,233 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Runtime.InteropServices;
|
||||
using CoreUtil.Internal;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct GZipHeader
|
||||
{
|
||||
public byte ID1, ID2, CM, FLG;
|
||||
public uint MTIME;
|
||||
public byte XFL, OS;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct GZipFooter
|
||||
{
|
||||
public uint CRC32;
|
||||
public uint ISIZE;
|
||||
}
|
||||
|
||||
public static class GZipUtil
|
||||
{
|
||||
public static byte[] Decompress(byte[] gzip)
|
||||
{
|
||||
using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
|
||||
{
|
||||
const int size = 4096;
|
||||
byte[] buffer = new byte[size];
|
||||
using (MemoryStream memory = new MemoryStream())
|
||||
{
|
||||
int count = 0;
|
||||
do
|
||||
{
|
||||
count = stream.Read(buffer, 0, size);
|
||||
if (count > 0)
|
||||
{
|
||||
memory.Write(buffer, 0, count);
|
||||
}
|
||||
}
|
||||
while (count > 0);
|
||||
return memory.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class GZipPacker
|
||||
{
|
||||
Fifo fifo;
|
||||
ZStream zs;
|
||||
long currentSize;
|
||||
uint crc32;
|
||||
bool finished;
|
||||
|
||||
public bool Finished
|
||||
{
|
||||
get { return finished; }
|
||||
}
|
||||
|
||||
public Fifo GeneratedData
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.fifo;
|
||||
}
|
||||
}
|
||||
|
||||
public GZipPacker()
|
||||
{
|
||||
fifo = new Fifo();
|
||||
|
||||
zs = new ZStream();
|
||||
zs.deflateInit(-1, -15);
|
||||
|
||||
this.currentSize = 0;
|
||||
this.crc32 = 0xffffffff;
|
||||
this.finished = false;
|
||||
|
||||
GZipHeader h = new GZipHeader();
|
||||
h.ID1 = 0x1f;
|
||||
h.ID2 = 0x8b;
|
||||
h.FLG = 0;
|
||||
h.MTIME = Util.DateTimeToUnixTime(DateTime.Now.ToUniversalTime());
|
||||
h.XFL = 0;
|
||||
h.OS = 3;
|
||||
h.CM = 8;
|
||||
|
||||
fifo.Write(Util.StructToByte(h));
|
||||
}
|
||||
|
||||
public void Write(byte[] data, int pos, int len, bool finish)
|
||||
{
|
||||
byte[] srcData = Util.ExtractByteArray(data, pos, len);
|
||||
byte[] dstData = new byte[srcData.Length * 2 + 100];
|
||||
|
||||
if (this.finished)
|
||||
{
|
||||
throw new ApplicationException("already finished");
|
||||
}
|
||||
|
||||
zs.next_in = srcData;
|
||||
zs.avail_in = srcData.Length;
|
||||
zs.next_in_index = 0;
|
||||
|
||||
zs.next_out = dstData;
|
||||
zs.avail_out = dstData.Length;
|
||||
zs.next_out_index = 0;
|
||||
|
||||
if (finish)
|
||||
{
|
||||
zs.deflate(zlibConst.Z_FINISH);
|
||||
}
|
||||
else
|
||||
{
|
||||
zs.deflate(zlibConst.Z_SYNC_FLUSH);
|
||||
}
|
||||
|
||||
fifo.Write(dstData, 0, dstData.Length - zs.avail_out);
|
||||
|
||||
currentSize += len;
|
||||
|
||||
this.crc32 = ZipUtil.Crc32Next(data, pos, len, this.crc32);
|
||||
|
||||
if (finish)
|
||||
{
|
||||
this.finished = true;
|
||||
this.crc32 = ~this.crc32;
|
||||
|
||||
GZipFooter f = new GZipFooter();
|
||||
f.CRC32 = this.crc32;
|
||||
f.ISIZE = (uint)(this.currentSize % 0x100000000);
|
||||
|
||||
fifo.Write(Util.StructToByte(f));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
170
src/BuildUtil/CoreUtil/Kernel.cs
Normal file
170
src/BuildUtil/CoreUtil/Kernel.cs
Normal file
@ -0,0 +1,170 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Mail;
|
||||
using System.Net.Mime;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public static class Kernel
|
||||
{
|
||||
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
private static extern bool IsWow64Process(
|
||||
[In] IntPtr hProcess,
|
||||
[Out] out bool wow64Process
|
||||
);
|
||||
|
||||
public static bool InternalCheckIsWow64()
|
||||
{
|
||||
if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
|
||||
Environment.OSVersion.Version.Major >= 6)
|
||||
{
|
||||
using (Process p = Process.GetCurrentProcess())
|
||||
{
|
||||
bool retVal;
|
||||
if (!IsWow64Process(p.Handle, out retVal))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void SleepThread(int millisec)
|
||||
{
|
||||
ThreadObj.Sleep(millisec);
|
||||
}
|
||||
|
||||
public static string GetEnvStr(string name)
|
||||
{
|
||||
string ret = Environment.GetEnvironmentVariable(name);
|
||||
|
||||
if (ret == null)
|
||||
{
|
||||
ret = "";
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static public void SelfKill()
|
||||
{
|
||||
System.Diagnostics.Process.GetCurrentProcess().Kill();
|
||||
}
|
||||
|
||||
public static Process Run(string exeName, string args)
|
||||
{
|
||||
Process p = new Process();
|
||||
p.StartInfo.FileName = IO.InnerFilePath(exeName);
|
||||
p.StartInfo.Arguments = args;
|
||||
|
||||
p.Start();
|
||||
|
||||
return p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
939
src/BuildUtil/CoreUtil/MultiLang.cs
Normal file
939
src/BuildUtil/CoreUtil/MultiLang.cs
Normal file
@ -0,0 +1,939 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Web.Mail;
|
||||
using System.Threading;
|
||||
using System.Xml;
|
||||
using System.Xml.Schema;
|
||||
using System.Xml.Serialization;
|
||||
using CoreUtil;
|
||||
|
||||
public static class AspUtil
|
||||
{
|
||||
public static void Redirect(Page page, string url)
|
||||
{
|
||||
Redirect(page, url, true);
|
||||
}
|
||||
public static void Redirect(Page page, string url, bool endSession)
|
||||
{
|
||||
MultiLang ml = new MultiLang(page, true);
|
||||
|
||||
ml.Redirect(url, true);
|
||||
}
|
||||
|
||||
public static string GetCurrentRequestUrl(Page page)
|
||||
{
|
||||
string s = (string)page.Request.Headers["SEISAPI_PHYSICAL_URL"];
|
||||
if (Str.IsEmptyStr(s) == false)
|
||||
{
|
||||
string[] tokens = s.Split('?');
|
||||
return tokens[0];
|
||||
}
|
||||
return page.Request.Path;
|
||||
}
|
||||
|
||||
public static string GetCurrentPhysicalFilePathForUser(Page page)
|
||||
{
|
||||
string s = (string)page.Request.Headers["SEISAPI_ORIGINAL_FILEPATH"];
|
||||
if (Str.IsEmptyStr(s) == false)
|
||||
{
|
||||
return s;
|
||||
}
|
||||
return page.Request.PhysicalPath;
|
||||
}
|
||||
|
||||
public static string RemoveDefaultHtml(string url)
|
||||
{
|
||||
string tmp = url.ToLower();
|
||||
if (tmp.EndsWith("/default.asp") || tmp.EndsWith("/default.aspx") || tmp.EndsWith("/default.htm") || tmp.EndsWith("/default.html"))
|
||||
{
|
||||
return GetUrlDirNameFromPath(url);
|
||||
}
|
||||
else
|
||||
{
|
||||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetUrlDirNameFromPath(string url)
|
||||
{
|
||||
string ret = "";
|
||||
string[] strs = url.Split('/');
|
||||
int i;
|
||||
if (strs.Length >= 1)
|
||||
{
|
||||
for (i = 0; i < strs.Length - 1; i++)
|
||||
{
|
||||
ret += strs[i] + "/";
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static string WebPathToFilePath(System.Web.UI.Page page, string path)
|
||||
{
|
||||
string appRootFilePath = page.Request.PhysicalApplicationPath;
|
||||
string appRootVirtualPath = page.Request.ApplicationPath;
|
||||
string ret;
|
||||
|
||||
path = RemoveDefaultHtml(path);
|
||||
if (path.ToUpper().StartsWith(appRootVirtualPath.ToUpper()) == false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
path = path.Substring(appRootVirtualPath.Length).Replace("/", "\\");
|
||||
|
||||
if (path.StartsWith("\\"))
|
||||
{
|
||||
path = path.Substring(1);
|
||||
}
|
||||
|
||||
ret = appRootFilePath + path;
|
||||
|
||||
if (ret.IndexOf("..") != -1)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (ret.EndsWith("\\"))
|
||||
{
|
||||
ret = GetDefaultDocumentIfExists(ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static string GetDefaultDocumentIfExists(string dir)
|
||||
{
|
||||
string[] targets =
|
||||
{
|
||||
"default.aspx",
|
||||
"default.asp",
|
||||
"default.html",
|
||||
"default.htm",
|
||||
"index.html",
|
||||
"index.htm",
|
||||
};
|
||||
|
||||
foreach (string s in targets)
|
||||
{
|
||||
string name = dir + s;
|
||||
|
||||
if (IsFileExists(name))
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static bool IsFileExists(string name)
|
||||
{
|
||||
return File.Exists(name);
|
||||
}
|
||||
}
|
||||
|
||||
public class MultiLang
|
||||
{
|
||||
public readonly Page Page;
|
||||
public readonly HttpRequest Request;
|
||||
public readonly HttpResponse Response;
|
||||
public readonly bool IsUrlModefied;
|
||||
public readonly string OriginalUrl;
|
||||
public readonly string PhysicalUrl;
|
||||
public readonly bool IsFilenameModified;
|
||||
public readonly string OriginalFileName;
|
||||
public readonly string OriginalFilePath;
|
||||
public readonly string Args;
|
||||
public readonly CoreLanguageClass CurrentLanguage;
|
||||
public readonly CoreLanguageClass ContentsPrintLanguage;
|
||||
public readonly string CurrentLanguageCode;
|
||||
public readonly bool IsCurrentLanguageSupported;
|
||||
public readonly string GoogleTranslateUrl;
|
||||
public readonly string OriginalFullUrl;
|
||||
public readonly bool IsSSL;
|
||||
public readonly string Host;
|
||||
public readonly string BasicHostName;
|
||||
MultiLanguageFilterStream mfs;
|
||||
public readonly List<KeyValuePair<string, string>> ReplaceList;
|
||||
|
||||
public bool DisableFilter
|
||||
{
|
||||
get
|
||||
{
|
||||
return mfs.DisableFilter;
|
||||
}
|
||||
set
|
||||
{
|
||||
mfs.DisableFilter = value;
|
||||
}
|
||||
}
|
||||
|
||||
public readonly string HtmlBody = "";
|
||||
public readonly string HtmlFileName = "";
|
||||
|
||||
static MultiLang()
|
||||
{
|
||||
CoreLanguageList.RegardsJapanAsJP = true;
|
||||
}
|
||||
|
||||
public bool IsJapanese
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.CurrentLanguage == CoreLanguageList.Japanese)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsJapanesePrinting
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.ContentsPrintLanguage == CoreLanguageList.Japanese)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void Redirect(string url, bool endSession)
|
||||
{
|
||||
url = ConvertPath(url);
|
||||
if (url.StartsWith("http://") || url.StartsWith("https://") || url.StartsWith("ftp://") ||
|
||||
url.StartsWith("/"))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
string originalUrl = OriginalUrl;
|
||||
if (originalUrl.EndsWith("/"))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
for (i = originalUrl.Length - 1; i >= 0; i--)
|
||||
{
|
||||
if (originalUrl[i] == '/' || originalUrl[i] == '\\')
|
||||
{
|
||||
originalUrl = originalUrl.Substring(0, i + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
url = originalUrl + url;
|
||||
}
|
||||
Response.Redirect(url, endSession);
|
||||
}
|
||||
|
||||
public MultiLang(Page currentPage)
|
||||
: this(currentPage, false)
|
||||
{
|
||||
}
|
||||
public MultiLang(Page currentPage, bool fast) : this(currentPage, fast, null)
|
||||
{
|
||||
}
|
||||
public MultiLang(Page currentPage, bool fast, string basicHostName)
|
||||
: this(currentPage, fast, basicHostName, new List<KeyValuePair<string, string>>())
|
||||
{
|
||||
}
|
||||
public MultiLang(Page currentPage, bool fast, string basicHostName, List<KeyValuePair<string, string>> replaceList)
|
||||
{
|
||||
this.Page = currentPage;
|
||||
|
||||
this.Request = Page.Request;
|
||||
this.Response = Page.Response;
|
||||
this.BasicHostName = basicHostName;
|
||||
string tmp = Page.Request.ServerVariables["HTTPS"];
|
||||
string hostRaw = Page.Request.Headers["Host"];
|
||||
this.ReplaceList = replaceList;
|
||||
bool isSsl = false;
|
||||
string[] tokens;
|
||||
string host = "";
|
||||
|
||||
tokens = hostRaw.Split(':');
|
||||
if (tokens.Length >= 1)
|
||||
{
|
||||
host = tokens[0];
|
||||
}
|
||||
|
||||
host = host.ToLower();
|
||||
|
||||
if (tmp != null)
|
||||
{
|
||||
if (tmp.Equals("on", StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
isSsl = true;
|
||||
}
|
||||
}
|
||||
|
||||
this.IsSSL = isSsl;
|
||||
this.Host = host;
|
||||
|
||||
this.IsUrlModefied = Str.StrToBool((string)Request.Headers["SEISAPI_MODIFIED_URL"]);
|
||||
this.OriginalUrl = (string)Request.Headers["SEISAPI_ORIGINAL_URL"];
|
||||
|
||||
int i;
|
||||
i = this.OriginalUrl.IndexOf("?");
|
||||
if (i != -1)
|
||||
{
|
||||
this.OriginalUrl = this.OriginalUrl.Substring(0, i);
|
||||
}
|
||||
|
||||
if (Str.IsEmptyStr(this.OriginalUrl) || this.IsUrlModefied == false)
|
||||
{
|
||||
this.OriginalUrl = AspUtil.RemoveDefaultHtml(AspUtil.GetCurrentRequestUrl(Page));
|
||||
}
|
||||
|
||||
string s = (string)Request.Headers["SEISAPI_ORIGINAL_FILENAME"];
|
||||
if (Str.IsEmptyStr(s) == false)
|
||||
{
|
||||
this.IsFilenameModified = true;
|
||||
this.OriginalFileName = s;
|
||||
this.OriginalFilePath = (string)Request.Headers["SEISAPI_ORIGINAL_FILEPATH"];
|
||||
}
|
||||
|
||||
string langCode = GetCurrentLangCodeFromPath(this.OriginalUrl);
|
||||
|
||||
this.CurrentLanguage = CoreLanguageList.GetLanguageClassByName(langCode);
|
||||
this.CurrentLanguageCode = CurrentLanguage.Name;
|
||||
|
||||
try
|
||||
{
|
||||
HtmlFileName = AspUtil.WebPathToFilePath(currentPage, AspUtil.GetCurrentRequestUrl(currentPage));
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
if (this.IsFilenameModified)
|
||||
{
|
||||
HtmlFileName = Path.Combine(Path.GetDirectoryName(HtmlFileName), Path.GetFileName(OriginalFilePath));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (fast == false)
|
||||
{
|
||||
HtmlBody = File.ReadAllText(HtmlFileName, Str.Utf8Encoding);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
PhysicalUrl = AspUtil.RemoveDefaultHtml(AspUtil.GetCurrentRequestUrl((currentPage)));
|
||||
|
||||
Args = currentPage.Request.ServerVariables["QUERY_STRING"];
|
||||
|
||||
if (CurrentLanguage == CoreLanguageList.Japanese)
|
||||
{
|
||||
IsCurrentLanguageSupported = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
IsCurrentLanguageSupported = Str.SearchStr(HtmlBody, string.Format("<!-- ml:{0} -->", CurrentLanguage.Name), 0, false) != -1;
|
||||
}
|
||||
|
||||
GoogleTranslateUrl = string.Format("http://translate.google.com/translate?js=n&prev=_t&hl=en&ie=UTF-8&layout=2&eotf=1&sl=ja&tl={1}&u={0}",
|
||||
HttpUtility.UrlEncode((isSsl ? "https://" : "http://") + host + this.OriginalUrl, Str.Utf8Encoding),
|
||||
this.CurrentLanguageCode);
|
||||
|
||||
OriginalFullUrl = (isSsl ? "https://" : "http://") + host + this.OriginalUrl;
|
||||
|
||||
ContentsPrintLanguage = this.CurrentLanguage;
|
||||
if (IsCurrentLanguageSupported == false)
|
||||
{
|
||||
ContentsPrintLanguage = CoreLanguageList.Japanese;
|
||||
}
|
||||
|
||||
if (fast == false)
|
||||
{
|
||||
mfs = new MultiLanguageFilterStream(Response.Filter, ContentsPrintLanguage, this.CurrentLanguage, this.BasicHostName, this.ReplaceList);
|
||||
mfs.Page = Page;
|
||||
Response.Filter = mfs;
|
||||
}
|
||||
}
|
||||
|
||||
public string ConvertPath(string url)
|
||||
{
|
||||
return ConvertPath(url, this.CurrentLanguage);
|
||||
}
|
||||
public string ConvertPath(string url, CoreLanguageClass lang)
|
||||
{
|
||||
string ja = CoreLanguageList.Japanese.Name;
|
||||
|
||||
if (url.StartsWith("/" + ja, StringComparison.InvariantCultureIgnoreCase))
|
||||
{
|
||||
url = "/" + lang.Name + url.Substring(ja.Length + 1);
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
public string GetPathForLanguage(CoreLanguageClass lang)
|
||||
{
|
||||
string url = PhysicalUrl;
|
||||
|
||||
return ConvertPath(url, lang);
|
||||
}
|
||||
|
||||
public string GetFullUrlForLanguage(CoreLanguageClass lang)
|
||||
{
|
||||
string url = (IsSSL ? "https://" : "http://") + Host + GetPathForLanguage(lang);
|
||||
|
||||
if (Str.IsEmptyStr(Args) == false)
|
||||
{
|
||||
url += "?" + Args;
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
public string ProcStr(string str)
|
||||
{
|
||||
return ProcStr(str, ContentsPrintLanguage);
|
||||
}
|
||||
|
||||
public static string ProcStrDefault(string str)
|
||||
{
|
||||
return ProcStr(str, CoreLanguageClass.CurrentThreadLanguageClass);
|
||||
}
|
||||
|
||||
public static string ProcStr(string str, CoreLanguageClass lang)
|
||||
{
|
||||
return ProcStr(str, lang, lang);
|
||||
}
|
||||
|
||||
public static string ProcStr(string str, CoreLanguageClass lang, CoreLanguageClass langPure)
|
||||
{
|
||||
MultiLanguageFilterStream st = new MultiLanguageFilterStream(null, lang, langPure, null, null);
|
||||
|
||||
return st.FilterString(str);
|
||||
}
|
||||
|
||||
public static string GetCurrentLangCodeFromPath(string str)
|
||||
{
|
||||
char[] sps =
|
||||
{
|
||||
'/', '?',
|
||||
};
|
||||
string[] tokens = str.Split(sps, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if (tokens.Length >= 1)
|
||||
{
|
||||
return tokens[0].ToLower();
|
||||
}
|
||||
|
||||
return CoreLanguageList.Japanese.Name;
|
||||
}
|
||||
}
|
||||
|
||||
public static class MultiString
|
||||
{
|
||||
public const string ChangeLanguage = "[j]Select Language[e]Select Language[/]";
|
||||
public const string LanguageNotSupported = "[j]申し訳ございませんが、以下のコンテンツは現在日本語で公開されていません。[e]Unfortunately, following contents are not published in English yet. [/]";
|
||||
public const string ThisIsTranslatedByMachine = "Following contents are translated automatically by Google Translate.";
|
||||
public const string GoogleTranslate = "[j]Google で翻訳[e]Click here to translate the contents into English by Google Now[/]";
|
||||
public const string ShowSrc = "Show the original page";
|
||||
|
||||
public static string GetStr(string srcStr, CoreLanguageClass lang)
|
||||
{
|
||||
return MultiLang.ProcStr(srcStr, lang);
|
||||
}
|
||||
}
|
||||
|
||||
public class MultiLanguageFilterStream : Stream
|
||||
{
|
||||
public static readonly List<KeyValuePair<string, CoreLanguageClass>> langKeys = new List<KeyValuePair<string, CoreLanguageClass>>();
|
||||
public readonly List<KeyValuePair<string, string>> ReplaceList = null;
|
||||
public const string TagPure = "<!-- ml:pure -->";
|
||||
public const string TagEndPure = "<!-- ml:endpure -->";
|
||||
public bool DisableFilter = false;
|
||||
public Page Page;
|
||||
|
||||
static MultiLanguageFilterStream()
|
||||
{
|
||||
langKeys.Add(new KeyValuePair<string, CoreLanguageClass>("[j]", CoreLanguageList.Japanese));
|
||||
langKeys.Add(new KeyValuePair<string, CoreLanguageClass>("[e]", CoreLanguageList.English));
|
||||
langKeys.Add(new KeyValuePair<string, CoreLanguageClass>("[/]", null));
|
||||
}
|
||||
|
||||
Stack<CoreLanguageClass> stack = new Stack<CoreLanguageClass>();
|
||||
CoreLanguageClass currentBodyLanguage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (stack.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
return stack.ToArray()[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
bool isLang(CoreLanguageClass lang)
|
||||
{
|
||||
CoreLanguageClass[] langList = stack.ToArray();
|
||||
|
||||
foreach (CoreLanguageClass c in langList)
|
||||
{
|
||||
if (c != lang)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
CoreLanguageClass lastBodyLanguage
|
||||
{
|
||||
get
|
||||
{
|
||||
if (stack.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
return stack.Peek();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string FilterString(string src)
|
||||
{
|
||||
string[] strList = Str.DivideStringMulti(src, true,
|
||||
TagPure, TagEndPure);
|
||||
|
||||
bool b = false;
|
||||
|
||||
StringBuilder ret = new StringBuilder();
|
||||
|
||||
foreach (string str in strList)
|
||||
{
|
||||
if (str == TagPure)
|
||||
{
|
||||
b = true;
|
||||
}
|
||||
else if (str == TagEndPure)
|
||||
{
|
||||
b = false;
|
||||
}
|
||||
|
||||
ret.Append(filterStringInner(str, b ? this.currentLanguagePure : this.currentLanguage, this.currentLanguagePure));
|
||||
}
|
||||
|
||||
return ret.ToString();
|
||||
}
|
||||
|
||||
string filterStringInner(string src, CoreLanguageClass useLang, CoreLanguageClass useLangPure)
|
||||
{
|
||||
int i;
|
||||
string ret = src;
|
||||
|
||||
if (Str.IsEmptyStr(basicHostName) == false)
|
||||
{
|
||||
ret = Str.ReplaceStr(ret, "=\"/\"", "=\"http://" + basicHostName + "/\"", false);
|
||||
ret = Str.ReplaceStr(ret, "=\'/\'", "=\'http://" + basicHostName + "/\'", false);
|
||||
|
||||
ret = Str.ReplaceStr(ret, "=\"/" + CoreLanguageList.Japanese.Name + "/\"", "=\"http://" + basicHostName + "/" + useLangPure.Name + "/\"", false);
|
||||
ret = Str.ReplaceStr(ret, "=\'/" + CoreLanguageList.Japanese.Name + "/\'", "=\'http://" + basicHostName + "/" + useLangPure.Name + "/\'", false);
|
||||
}
|
||||
|
||||
ret = Str.ReplaceStr(ret, "=\"/" + CoreLanguageList.Japanese.Name + "/", "=\"/" + useLangPure.Name + "/", false);
|
||||
ret = Str.ReplaceStr(ret, "=\'/" + CoreLanguageList.Japanese.Name + "/", "=\'/" + useLangPure.Name + "/", false);
|
||||
|
||||
ret = Str.ReplaceStr(ret, "_lm_" + CoreLanguageList.Japanese.Name, "_lm_" + useLang.Name, false);
|
||||
|
||||
if (this.ReplaceList != null)
|
||||
{
|
||||
foreach (KeyValuePair<string, string> p in this.ReplaceList)
|
||||
{
|
||||
ret = Str.ReplaceStr(ret, p.Key, p.Value, false);
|
||||
}
|
||||
}
|
||||
|
||||
StringBuilder ret2 = new StringBuilder();
|
||||
|
||||
int next = 0;
|
||||
while (true)
|
||||
{
|
||||
int min = int.MaxValue;
|
||||
int j = -1;
|
||||
for (i = 0; i < langKeys.Count; i++)
|
||||
{
|
||||
int r = Str.SearchStr(ret, langKeys[i].Key, next, false);
|
||||
if (r != -1)
|
||||
{
|
||||
if (r < min)
|
||||
{
|
||||
j = i;
|
||||
min = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (j != -1)
|
||||
{
|
||||
KeyValuePair<string, CoreLanguageClass> v = langKeys[j];
|
||||
|
||||
if (currentBodyLanguage == null || isLang(useLang))
|
||||
{
|
||||
ret2.Append(ret.Substring(next, min - next));
|
||||
}
|
||||
|
||||
if (v.Value != null)
|
||||
{
|
||||
if (lastBodyLanguage == null || v.Value.Id <= lastBodyLanguage.Id)
|
||||
{
|
||||
stack.Push(v.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
stack.Pop();
|
||||
stack.Push(v.Value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
stack.Pop();
|
||||
}
|
||||
|
||||
next = min + v.Key.Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (currentBodyLanguage == null || isLang(useLang))
|
||||
{
|
||||
ret2.Append(ret.Substring(next, ret.Length - next));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = ret2.ToString();
|
||||
|
||||
string lang = useLangPure != CoreLanguageList.Japanese ? useLangPure.Name : "ja";
|
||||
|
||||
if (useLangPure != CoreLanguageList.Japanese)
|
||||
{
|
||||
ret = Str.ReplaceStr(ret, "<meta http-equiv=\"Content-Language\" content=\"ja\" />",
|
||||
string.Format("<meta http-equiv=\"Content-Language\" content=\"{0}\" />", lang), false);
|
||||
}
|
||||
|
||||
ret = Str.ReplaceStr(ret, "<html>", string.Format("<html lang=\"{0}\">", lang), false);
|
||||
|
||||
next = 0;
|
||||
while (true)
|
||||
{
|
||||
i = Str.SearchStr(ret, "<link rel=\"stylesheet\" href=\"", next, false);
|
||||
if (i == -1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
next = i + 1;
|
||||
int j = Str.SearchStr(ret, "/>", next, false);
|
||||
if (j == -1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
string linkStr = ret.Substring(i, j - i + 2 - 1);
|
||||
int k = Str.SearchStr(linkStr, "href=\"", 0, false);
|
||||
if (k != -1)
|
||||
{
|
||||
int m = Str.SearchStr(linkStr, "\"", k + 6, false);
|
||||
if (m != -1)
|
||||
{
|
||||
string fileName = linkStr.Substring(k + 6, m - k - 6);
|
||||
fileName = Str.ReplaceStr(fileName, ".css", "_" + lang + ".css", false);
|
||||
string linkStr2 = string.Format("<link rel=\"stylesheet\" href=\"{0}\" type=\"text/css\" />", fileName);
|
||||
|
||||
ret = ret.Substring(0, j + 2) + linkStr2 + ret.Substring(j + 2);
|
||||
next = j + 2 + linkStr2.Length;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Stream baseStream;
|
||||
long position;
|
||||
CoreLanguageClass currentLanguage;
|
||||
CoreLanguageClass currentLanguagePure;
|
||||
string basicHostName;
|
||||
|
||||
public override bool CanRead
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public override bool CanSeek
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public override bool CanWrite
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public override void Flush()
|
||||
{
|
||||
baseStream.Flush();
|
||||
}
|
||||
|
||||
public override long Length
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
|
||||
public override long Position
|
||||
{
|
||||
get
|
||||
{
|
||||
return position;
|
||||
}
|
||||
set
|
||||
{
|
||||
position = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override long Seek(long offset, SeekOrigin origin)
|
||||
{
|
||||
return baseStream.Seek(offset, origin);
|
||||
}
|
||||
|
||||
public override void SetLength(long value)
|
||||
{
|
||||
baseStream.SetLength(value);
|
||||
}
|
||||
|
||||
public MultiLanguageFilterStream(Stream baseStream, CoreLanguageClass currentLanguage, CoreLanguageClass currentLanguagePure, string basicHostName, List<KeyValuePair<string, string>> replaceList)
|
||||
{
|
||||
this.baseStream = baseStream;
|
||||
this.currentLanguage = currentLanguage;
|
||||
this.currentLanguagePure = currentLanguagePure;
|
||||
this.basicHostName = basicHostName;
|
||||
this.ReplaceList = replaceList;
|
||||
}
|
||||
|
||||
public override int Read(byte[] buffer, int offset, int count)
|
||||
{
|
||||
return baseStream.Read(buffer, offset, count);
|
||||
}
|
||||
|
||||
string savedString = "";
|
||||
|
||||
public override void Write(byte[] buffer, int offset, int count)
|
||||
{
|
||||
if (DisableFilter)
|
||||
{
|
||||
baseStream.Write(buffer, offset, count);
|
||||
return;
|
||||
}
|
||||
byte[] data = new byte[count];
|
||||
Buffer.BlockCopy(buffer, offset, data, 0, count);
|
||||
|
||||
string inSrc = savedString + ByteDataToString(data);// Str.Utf8Encoding.GetString(data);
|
||||
|
||||
savedString = "";
|
||||
|
||||
if (inSrc.Length >= 2)
|
||||
{
|
||||
int len = inSrc.Length;
|
||||
string last2 = inSrc.Substring(len - 2, 2);
|
||||
string last1 = inSrc.Substring(len - 1, 1);
|
||||
|
||||
if (last1 == "[")
|
||||
{
|
||||
inSrc = inSrc.Substring(0, len - 1);
|
||||
|
||||
savedString = last1;
|
||||
}
|
||||
else if (Str.InStr(last2, "["))
|
||||
{
|
||||
inSrc = inSrc.Substring(0, len - 2);
|
||||
|
||||
savedString = last2;
|
||||
}
|
||||
}
|
||||
|
||||
string inStr = FilterString(inSrc);
|
||||
|
||||
data = StringToByteData(inStr);// Str.Utf8Encoding.GetBytes(inStr);
|
||||
|
||||
if (data.Length >= 1)
|
||||
{
|
||||
baseStream.Write(data, 0, data.Length);
|
||||
//byte[] t = Str.Utf8Encoding.GetBytes("" + count.ToString() + "");
|
||||
//baseStream.Write(t, 0, t.Length);
|
||||
}
|
||||
}
|
||||
|
||||
public static string ByteDataToString(byte[] data)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
foreach (byte b in data)
|
||||
{
|
||||
if (b <= 0x7f && b != (byte)('\\'))
|
||||
{
|
||||
sb.Append((char)b);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append("\\" + ((uint)b).ToString("X2"));
|
||||
}
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public byte[] StringToByteData(string str)
|
||||
{
|
||||
int i, len;
|
||||
|
||||
len = str.Length;
|
||||
Buf b = new Buf();
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
char c = str[i];
|
||||
if (c == '\\')
|
||||
{
|
||||
string tmp = "";
|
||||
|
||||
//try
|
||||
{
|
||||
tmp = "" + str[i + 1] + str[i + 2];
|
||||
}
|
||||
/*catch (Exception ex)
|
||||
{
|
||||
tmp += "|err=" + ex.Message + ",len=" + len + ",i=" + i + "|src=" + str + "|";
|
||||
byte[] aa = Str.Utf8Encoding.GetBytes(tmp);
|
||||
b.Write(aa);
|
||||
}*/
|
||||
|
||||
i += 2;
|
||||
|
||||
//try
|
||||
{
|
||||
b.WriteByte(byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber));
|
||||
}
|
||||
//catch
|
||||
{
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
b.WriteByte((byte)c);
|
||||
}
|
||||
}
|
||||
|
||||
return b.ByteData;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
202
src/BuildUtil/CoreUtil/Packer.cs
Normal file
202
src/BuildUtil/CoreUtil/Packer.cs
Normal file
@ -0,0 +1,202 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public enum PackerFileFormat
|
||||
{
|
||||
ZipRaw,
|
||||
ZipCompressed,
|
||||
Tar,
|
||||
TarGZip,
|
||||
}
|
||||
|
||||
public delegate bool ProgressDelegate(string fileNameFullPath, string fileNameRelative, int currentFileNum, int totalFileNum);
|
||||
|
||||
public static class Packer
|
||||
{
|
||||
public static byte[] PackDir(PackerFileFormat format, string rootDirPath, string appendPrefixDirName)
|
||||
{
|
||||
return PackDir(format, rootDirPath, appendPrefixDirName, null);
|
||||
}
|
||||
public static byte[] PackDir(PackerFileFormat format, string topDirPath, string appendPrefixDirName, ProgressDelegate proc)
|
||||
{
|
||||
string[] fileList = Directory.GetFiles(topDirPath, "*", SearchOption.AllDirectories);
|
||||
List<string> relativeFileList = new List<string>();
|
||||
|
||||
foreach (string fileName in fileList)
|
||||
{
|
||||
string relativePath = IO.GetRelativeFileName(fileName, topDirPath);
|
||||
|
||||
if (Str.IsEmptyStr(appendPrefixDirName) == false)
|
||||
{
|
||||
relativePath = IO.RemoteLastEnMark(appendPrefixDirName) + "\\" + relativePath;
|
||||
}
|
||||
|
||||
relativeFileList.Add(relativePath);
|
||||
}
|
||||
|
||||
return PackFiles(format, fileList, relativeFileList.ToArray(), proc);
|
||||
}
|
||||
|
||||
public static byte[] PackFiles(PackerFileFormat format, string[] srcFileNameList, string[] relativeNameList)
|
||||
{
|
||||
return PackFiles(format, srcFileNameList, relativeNameList, null);
|
||||
}
|
||||
public static byte[] PackFiles(PackerFileFormat format, string[] srcFileNameList, string[] relativeNameList, ProgressDelegate proc)
|
||||
{
|
||||
if (srcFileNameList.Length != relativeNameList.Length)
|
||||
{
|
||||
throw new ApplicationException("srcFileNameList.Length != relativeNameList.Length");
|
||||
}
|
||||
|
||||
int num = srcFileNameList.Length;
|
||||
int i;
|
||||
|
||||
ZipPacker zip = new ZipPacker();
|
||||
TarPacker tar = new TarPacker();
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
if (proc != null)
|
||||
{
|
||||
bool ret = proc(srcFileNameList[i], relativeNameList[i], i, num);
|
||||
|
||||
if (ret == false)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
byte[] srcData = File.ReadAllBytes(srcFileNameList[i]);
|
||||
DateTime date = File.GetLastWriteTime(srcFileNameList[i]);
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case PackerFileFormat.Tar:
|
||||
case PackerFileFormat.TarGZip:
|
||||
tar.AddFileSimple(relativeNameList[i], srcData, 0, srcData.Length, date);
|
||||
break;
|
||||
|
||||
case PackerFileFormat.ZipRaw:
|
||||
case PackerFileFormat.ZipCompressed:
|
||||
zip.AddFileSimple(relativeNameList[i], date, FileAttributes.Normal, srcData, (format == PackerFileFormat.ZipCompressed));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case PackerFileFormat.Tar:
|
||||
tar.Finish();
|
||||
return tar.GeneratedData.Read();
|
||||
|
||||
case PackerFileFormat.TarGZip:
|
||||
tar.Finish();
|
||||
return tar.CompressToGZip();
|
||||
|
||||
case PackerFileFormat.ZipCompressed:
|
||||
case PackerFileFormat.ZipRaw:
|
||||
zip.Finish();
|
||||
return zip.GeneratedData.Read();
|
||||
|
||||
default:
|
||||
throw new ApplicationException("format");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
225
src/BuildUtil/CoreUtil/RC4.cs
Normal file
225
src/BuildUtil/CoreUtil/RC4.cs
Normal file
@ -0,0 +1,225 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public class RC4 : ICloneable
|
||||
{
|
||||
uint x, y;
|
||||
uint[] state;
|
||||
|
||||
public RC4(byte[] key)
|
||||
{
|
||||
state = new uint[256];
|
||||
|
||||
uint i, t, u, ki, si;
|
||||
|
||||
x = 0;
|
||||
y = 0;
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
state[i] = i;
|
||||
}
|
||||
|
||||
ki = si = 0;
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
t = state[i];
|
||||
|
||||
si = (si + key[ki] + t) & 0xff;
|
||||
u = state[si];
|
||||
state[si] = t;
|
||||
state[i] = u;
|
||||
if (++ki >= key.Length)
|
||||
{
|
||||
ki = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private RC4()
|
||||
{
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
RC4 rc4 = new RC4();
|
||||
|
||||
rc4.x = this.x;
|
||||
rc4.y = this.y;
|
||||
rc4.state = (uint[])this.state.Clone();
|
||||
|
||||
return rc4;
|
||||
}
|
||||
|
||||
public byte[] Encrypt(byte[] src)
|
||||
{
|
||||
return Encrypt(src, src.Length);
|
||||
}
|
||||
public byte[] Encrypt(byte[] src, int len)
|
||||
{
|
||||
return Encrypt(src, 0, len);
|
||||
}
|
||||
public byte[] Encrypt(byte[] src, int offset, int len)
|
||||
{
|
||||
byte[] dst = new byte[len];
|
||||
|
||||
uint x, y, sx, sy;
|
||||
x = this.x;
|
||||
y = this.y;
|
||||
|
||||
int src_i = 0, dst_i = 0, end_src_i;
|
||||
|
||||
for (end_src_i = src_i + len; src_i != end_src_i; src_i++, dst_i++)
|
||||
{
|
||||
x = (x + 1) & 0xff;
|
||||
sx = state[x];
|
||||
y = (sx + y) & 0xff;
|
||||
state[x] = sy = state[y];
|
||||
state[y] = sx;
|
||||
dst[dst_i] = (byte)(src[src_i + offset] ^ state[(sx + sy) & 0xff]);
|
||||
}
|
||||
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
|
||||
return dst;
|
||||
}
|
||||
public void SkipDecrypt(int len)
|
||||
{
|
||||
SkipEncrypt(len);
|
||||
}
|
||||
public void SkipEncrypt(int len)
|
||||
{
|
||||
uint x, y, sx, sy;
|
||||
x = this.x;
|
||||
y = this.y;
|
||||
|
||||
int src_i = 0, dst_i = 0, end_src_i;
|
||||
|
||||
for (end_src_i = src_i + len; src_i != end_src_i; src_i++, dst_i++)
|
||||
{
|
||||
x = (x + 1) & 0xff;
|
||||
sx = state[x];
|
||||
y = (sx + y) & 0xff;
|
||||
state[x] = sy = state[y];
|
||||
state[y] = sx;
|
||||
}
|
||||
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public byte[] Decrypt(byte[] src)
|
||||
{
|
||||
return Decrypt(src, src.Length);
|
||||
}
|
||||
public byte[] Decrypt(byte[] src, int len)
|
||||
{
|
||||
return Decrypt(src, 0, len);
|
||||
}
|
||||
public byte[] Decrypt(byte[] src, int offset, int len)
|
||||
{
|
||||
return Encrypt(src, offset, len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
306
src/BuildUtil/CoreUtil/ReadIni.cs
Normal file
306
src/BuildUtil/CoreUtil/ReadIni.cs
Normal file
@ -0,0 +1,306 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Web.Mail;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
class IniCache
|
||||
{
|
||||
static Dictionary<string, IniCacheEntry> caches = new Dictionary<string, IniCacheEntry>();
|
||||
|
||||
class IniCacheEntry
|
||||
{
|
||||
DateTime lastUpdate;
|
||||
public DateTime LastUpdate
|
||||
{
|
||||
get { return lastUpdate; }
|
||||
}
|
||||
|
||||
Dictionary<string, string> datas;
|
||||
public Dictionary<string, string> Datas
|
||||
{
|
||||
get { return datas; }
|
||||
}
|
||||
|
||||
public IniCacheEntry(DateTime lastUpdate, Dictionary<string, string> datas)
|
||||
{
|
||||
this.lastUpdate = lastUpdate;
|
||||
this.datas = datas;
|
||||
}
|
||||
}
|
||||
|
||||
public static Dictionary<string, string> GetCache(string filename, DateTime lastUpdate)
|
||||
{
|
||||
lock (caches)
|
||||
{
|
||||
try
|
||||
{
|
||||
IniCacheEntry e = caches[filename];
|
||||
if (e.LastUpdate == lastUpdate || lastUpdate.Ticks == 0)
|
||||
{
|
||||
return e.Datas;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddCache(string filename, DateTime lastUpdate, Dictionary<string, string> datas)
|
||||
{
|
||||
lock (caches)
|
||||
{
|
||||
if (caches.ContainsKey(filename))
|
||||
{
|
||||
caches.Remove(filename);
|
||||
}
|
||||
|
||||
caches.Add(filename, new IniCacheEntry(lastUpdate, datas));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ReadIni
|
||||
{
|
||||
Dictionary<string, string> datas;
|
||||
bool updated;
|
||||
|
||||
public bool Updated
|
||||
{
|
||||
get
|
||||
{
|
||||
return updated;
|
||||
}
|
||||
}
|
||||
|
||||
public StrData this[string key]
|
||||
{
|
||||
get
|
||||
{
|
||||
string s;
|
||||
try
|
||||
{
|
||||
s = datas[key.ToUpper()];
|
||||
}
|
||||
catch
|
||||
{
|
||||
s = null;
|
||||
}
|
||||
|
||||
return new StrData(s);
|
||||
}
|
||||
}
|
||||
|
||||
public string[] GetKeys()
|
||||
{
|
||||
List<string> ret = new List<string>();
|
||||
|
||||
foreach (string s in datas.Keys)
|
||||
{
|
||||
ret.Add(s);
|
||||
}
|
||||
|
||||
return ret.ToArray();
|
||||
}
|
||||
|
||||
public ReadIni(string filename)
|
||||
{
|
||||
init(null, filename);
|
||||
}
|
||||
|
||||
void init(byte[] data)
|
||||
{
|
||||
init(data, null);
|
||||
}
|
||||
void init(byte[] data, string filename)
|
||||
{
|
||||
updated = false;
|
||||
|
||||
lock (typeof(ReadIni))
|
||||
{
|
||||
string[] lines;
|
||||
string srcstr;
|
||||
DateTime lastUpdate = new DateTime(0);
|
||||
|
||||
if (filename != null)
|
||||
{
|
||||
lastUpdate = IO.GetLastWriteTimeUtc(filename);
|
||||
|
||||
datas = IniCache.GetCache(filename, lastUpdate);
|
||||
}
|
||||
|
||||
if (datas == null)
|
||||
{
|
||||
if (data == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
data = Buf.ReadFromFile(filename).ByteData;
|
||||
}
|
||||
catch
|
||||
{
|
||||
data = new byte[0];
|
||||
datas = IniCache.GetCache(filename, new DateTime());
|
||||
}
|
||||
}
|
||||
|
||||
if (datas == null)
|
||||
{
|
||||
datas = new Dictionary<string, string>();
|
||||
Encoding currentEncoding = Str.Utf8Encoding;
|
||||
srcstr = currentEncoding.GetString(data);
|
||||
|
||||
lines = Str.GetLines(srcstr);
|
||||
|
||||
foreach (string s in lines)
|
||||
{
|
||||
string line = s.Trim();
|
||||
|
||||
if (Str.IsEmptyStr(line) == false)
|
||||
{
|
||||
if (line.StartsWith("#") == false &&
|
||||
line.StartsWith("//") == false &&
|
||||
line.StartsWith(";") == false)
|
||||
{
|
||||
string key, value;
|
||||
|
||||
if (Str.GetKeyAndValue(line, out key, out value))
|
||||
{
|
||||
key = key.ToUpper();
|
||||
|
||||
if (datas.ContainsKey(key) == false)
|
||||
{
|
||||
datas.Add(key, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
for (i = 1; ; i++)
|
||||
{
|
||||
string key2 = string.Format("{0}({1})", key, i).ToUpper();
|
||||
|
||||
if (datas.ContainsKey(key2) == false)
|
||||
{
|
||||
datas.Add(key2, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (filename != null)
|
||||
{
|
||||
IniCache.AddCache(filename, lastUpdate, datas);
|
||||
}
|
||||
|
||||
updated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
537
src/BuildUtil/CoreUtil/Reg.cs
Normal file
537
src/BuildUtil/CoreUtil/Reg.cs
Normal file
@ -0,0 +1,537 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public class AppReg
|
||||
{
|
||||
string appSubKey;
|
||||
public string AppSubKey
|
||||
{
|
||||
get { return appSubKey; }
|
||||
}
|
||||
RegRoot rootKey;
|
||||
public RegRoot RootKey
|
||||
{
|
||||
get { return rootKey; }
|
||||
}
|
||||
|
||||
public AppReg(RegRoot root, string subkey)
|
||||
{
|
||||
subkey = subkey.TrimEnd('\\');
|
||||
this.rootKey = root;
|
||||
this.appSubKey = subkey;
|
||||
}
|
||||
|
||||
public AppReg GetSubReg(string subKeyName)
|
||||
{
|
||||
return new AppReg(rootKey, appSubKey + "\\" + subKeyName);
|
||||
}
|
||||
|
||||
public bool WriteStr(string name, string value)
|
||||
{
|
||||
return Reg.WriteStr(rootKey, appSubKey, name, value);
|
||||
}
|
||||
|
||||
public bool WriteInt(string name, int value)
|
||||
{
|
||||
return Reg.WriteInt(rootKey, appSubKey, name, value);
|
||||
}
|
||||
|
||||
public bool WriteStrList(string name, string[] values)
|
||||
{
|
||||
return Reg.WriteStrList(rootKey, appSubKey, name, values);
|
||||
}
|
||||
|
||||
public bool WriteByte(string name, byte[] data)
|
||||
{
|
||||
return Reg.WriteByte(rootKey, appSubKey, name, data);
|
||||
}
|
||||
|
||||
public bool DeleteValue(string name)
|
||||
{
|
||||
return Reg.DeleteValue(rootKey, appSubKey, name);
|
||||
}
|
||||
|
||||
public string ReadStr(string name)
|
||||
{
|
||||
return Reg.ReadStr(rootKey, appSubKey, name);
|
||||
}
|
||||
|
||||
public int ReadInt(string name)
|
||||
{
|
||||
return Reg.ReadInt(rootKey, appSubKey, name);
|
||||
}
|
||||
|
||||
public string[] ReadStrList(string name)
|
||||
{
|
||||
return Reg.ReadStrList(rootKey, appSubKey, name);
|
||||
}
|
||||
|
||||
public byte[] ReadByte(string name)
|
||||
{
|
||||
return Reg.ReadByte(rootKey, appSubKey, name);
|
||||
}
|
||||
}
|
||||
|
||||
public enum RegRoot
|
||||
{
|
||||
LocalMachine = 0,
|
||||
CurrentUser = 1,
|
||||
Users = 2,
|
||||
}
|
||||
|
||||
public static class Reg
|
||||
{
|
||||
static RegistryKey rootKey(RegRoot r)
|
||||
{
|
||||
switch (r)
|
||||
{
|
||||
case RegRoot.LocalMachine:
|
||||
return Registry.LocalMachine;
|
||||
|
||||
case RegRoot.CurrentUser:
|
||||
return Registry.CurrentUser;
|
||||
|
||||
case RegRoot.Users:
|
||||
return Registry.Users;
|
||||
}
|
||||
|
||||
throw new ArgumentException();
|
||||
}
|
||||
|
||||
public static string[] EnumValue(RegRoot root, string keyname)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).OpenSubKey(keyname);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
return new string[0];
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return key.GetValueNames();
|
||||
}
|
||||
finally
|
||||
{
|
||||
key.Close();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new string[0];
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] EnumKey(RegRoot root, string keyname)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).OpenSubKey(keyname);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
return new string[0];
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return key.GetSubKeyNames();
|
||||
}
|
||||
finally
|
||||
{
|
||||
key.Close();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new string[0];
|
||||
}
|
||||
}
|
||||
|
||||
public static bool WriteByte(RegRoot root, string keyname, string valuename, byte[] data)
|
||||
{
|
||||
return WriteValue(root, keyname, valuename, data);
|
||||
}
|
||||
|
||||
public static byte[] ReadByte(RegRoot root, string keyname, string valuename)
|
||||
{
|
||||
object o = ReadValue(root, keyname, valuename);
|
||||
if (o == null)
|
||||
{
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return (byte[])o;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new byte[0];
|
||||
}
|
||||
}
|
||||
|
||||
public static bool WriteInt(RegRoot root, string keyname, string valuename, int value)
|
||||
{
|
||||
return WriteValue(root, keyname, valuename, value);
|
||||
}
|
||||
|
||||
public static int ReadInt(RegRoot root, string keyname, string valuename)
|
||||
{
|
||||
object o = ReadValue(root, keyname, valuename);
|
||||
if (o == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return (int)o;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool WriteStrList(RegRoot root, string keyname, string valuename, string[] value)
|
||||
{
|
||||
return WriteValue(root, keyname, valuename, value);
|
||||
}
|
||||
|
||||
public static string[] ReadStrList(RegRoot root, string keyname, string valuename)
|
||||
{
|
||||
object o = ReadValue(root, keyname, valuename);
|
||||
if (o == null)
|
||||
{
|
||||
return new string[0];
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return (string[])o;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return new string[0];
|
||||
}
|
||||
}
|
||||
|
||||
public static bool WriteStr(RegRoot root, string keyname, string valuename, string value)
|
||||
{
|
||||
return WriteValue(root, keyname, valuename, value);
|
||||
}
|
||||
|
||||
public static string ReadStr(RegRoot root, string keyname, string valuename)
|
||||
{
|
||||
object o = ReadValue(root, keyname, valuename);
|
||||
if (o == null)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return (string)o;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public static bool WriteValue(RegRoot root, string keyname, string valuename, object o)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).OpenSubKey(keyname, true);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
key = rootKey(root).CreateSubKey(keyname);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
key.SetValue(valuename, o);
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
key.Close();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static object ReadValue(RegRoot root, string keyname, string valuename)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).OpenSubKey(keyname);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return key.GetValue(valuename);
|
||||
}
|
||||
finally
|
||||
{
|
||||
key.Close();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsValue(RegRoot root, string keyname, string valuename)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).OpenSubKey(keyname);
|
||||
|
||||
try
|
||||
{
|
||||
object o = key.GetValue(valuename);
|
||||
|
||||
if (o == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
key.Close();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool DeleteValue(RegRoot root, string keyname, string valuename)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).OpenSubKey(keyname, true);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
key.DeleteValue(valuename);
|
||||
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
key.Close();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool DeleteKey(RegRoot root, string keyname)
|
||||
{
|
||||
return DeleteKey(root, keyname, false);
|
||||
}
|
||||
public static bool DeleteKey(RegRoot root, string keyname, bool deleteAll)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (deleteAll == false)
|
||||
{
|
||||
rootKey(root).DeleteSubKey(keyname);
|
||||
}
|
||||
else
|
||||
{
|
||||
rootKey(root).DeleteSubKeyTree(keyname);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool NewKey(RegRoot root, string keyname)
|
||||
{
|
||||
if (IsKey(root, keyname))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).CreateSubKey(keyname);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
key.Close();
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsKey(RegRoot root, string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
RegistryKey key = rootKey(root).OpenSubKey(name);
|
||||
|
||||
if (key == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
key.Close();
|
||||
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
1029
src/BuildUtil/CoreUtil/Secure.cs
Normal file
1029
src/BuildUtil/CoreUtil/Secure.cs
Normal file
File diff suppressed because it is too large
Load Diff
352
src/BuildUtil/CoreUtil/Stb.cs
Normal file
352
src/BuildUtil/CoreUtil/Stb.cs
Normal file
@ -0,0 +1,352 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Mail;
|
||||
using System.Net.Mime;
|
||||
using System.Reflection;
|
||||
using CoreUtil;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public class Stb
|
||||
{
|
||||
Dictionary<string, StbEntry> entryList;
|
||||
|
||||
public string this[string name]
|
||||
{
|
||||
get
|
||||
{
|
||||
if (entryList.ContainsKey(name.ToUpper()))
|
||||
{
|
||||
return entryList[name.ToUpper()].String;
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Stb(string filename)
|
||||
{
|
||||
init(IO.ReadFile(filename));
|
||||
}
|
||||
|
||||
public Stb(byte[] data)
|
||||
{
|
||||
init(data);
|
||||
}
|
||||
|
||||
void init(byte[] data)
|
||||
{
|
||||
entryList = new Dictionary<string, StbEntry>();
|
||||
MemoryStream ms = new MemoryStream(data);
|
||||
StreamReader sr = new StreamReader(ms);
|
||||
string prefix = "";
|
||||
|
||||
while (true)
|
||||
{
|
||||
string tmp = sr.ReadLine();
|
||||
if (tmp == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
StbEntry t = StbEntry.ParseTableLine(tmp, ref prefix);
|
||||
if (t != null)
|
||||
{
|
||||
if (entryList.ContainsKey(t.Name.ToUpper()) == false)
|
||||
{
|
||||
entryList.Add(t.Name.ToUpper(), t);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const string standardStbFileName = "|strtable.stb";
|
||||
static string defaultStbFileName = standardStbFileName;
|
||||
static object lockObj = new object();
|
||||
static Stb defaultStb = null;
|
||||
public static string DefaultStbFileName
|
||||
{
|
||||
set
|
||||
{
|
||||
defaultStbFileName = value;
|
||||
}
|
||||
|
||||
get
|
||||
{
|
||||
return defaultStbFileName;
|
||||
}
|
||||
}
|
||||
public static Stb DefaultStb
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (lockObj)
|
||||
{
|
||||
if (defaultStb == null)
|
||||
{
|
||||
defaultStb = new Stb(Stb.DefaultStbFileName);
|
||||
}
|
||||
|
||||
return defaultStb;
|
||||
}
|
||||
}
|
||||
}
|
||||
public static string SS(string name)
|
||||
{
|
||||
return DefaultStb[name];
|
||||
}
|
||||
public static uint II(string name)
|
||||
{
|
||||
return Str.StrToUInt(SS(name));
|
||||
}
|
||||
}
|
||||
|
||||
public class StbEntry
|
||||
{
|
||||
string name;
|
||||
public string Name
|
||||
{
|
||||
get { return name; }
|
||||
}
|
||||
|
||||
string str;
|
||||
public string String
|
||||
{
|
||||
get { return str; }
|
||||
}
|
||||
|
||||
public StbEntry(string name, string str)
|
||||
{
|
||||
this.name = name;
|
||||
this.str = str;
|
||||
}
|
||||
public static StbEntry ParseTableLine(string line, ref string prefix)
|
||||
{
|
||||
int i, len;
|
||||
int string_start;
|
||||
int len_name;
|
||||
string name, name2;
|
||||
|
||||
line = line.TrimStart(' ', '\t');
|
||||
len = line.Length;
|
||||
if (len == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (line[0] == '#' || (line[0] == '/' && line[1] == '/'))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
bool b = false;
|
||||
len_name = 0;
|
||||
for (i = 0; i < line.Length; i++)
|
||||
{
|
||||
if (line[i] == ' ' || line[i] == '\t')
|
||||
{
|
||||
b = true;
|
||||
break;
|
||||
}
|
||||
len_name++;
|
||||
}
|
||||
|
||||
if (b == false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
name = line.Substring(0, len_name);
|
||||
|
||||
string_start = len_name;
|
||||
for (i = len_name; i < len; i++)
|
||||
{
|
||||
if (line[i] != ' ' && line[i] != '\t')
|
||||
{
|
||||
break;
|
||||
}
|
||||
string_start++;
|
||||
}
|
||||
if (i == len)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
string str = line.Substring(string_start);
|
||||
|
||||
str = UnescapeStr(str);
|
||||
|
||||
if (Str.StrCmpi(name, "PREFIX"))
|
||||
{
|
||||
prefix = str;
|
||||
prefix = prefix.TrimStart();
|
||||
|
||||
if (Str.StrCmpi(prefix, "$") || Str.StrCmpi(prefix, "NULL"))
|
||||
{
|
||||
prefix = "";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
name2 = "";
|
||||
|
||||
if (prefix != "")
|
||||
{
|
||||
name2 += prefix + "@";
|
||||
}
|
||||
|
||||
name2 += name;
|
||||
|
||||
return new StbEntry(name2, str);
|
||||
}
|
||||
|
||||
public static string UnescapeStr(string str)
|
||||
{
|
||||
int i, len;
|
||||
string tmp;
|
||||
|
||||
len = str.Length;
|
||||
tmp = "";
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
if (str[i] == '\\')
|
||||
{
|
||||
i++;
|
||||
switch (str[i])
|
||||
{
|
||||
case '\\':
|
||||
tmp += '\\';
|
||||
break;
|
||||
|
||||
case ' ':
|
||||
tmp += ' ';
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
case 'N':
|
||||
tmp += '\n';
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
case 'R':
|
||||
tmp += '\r';
|
||||
break;
|
||||
|
||||
case 't':
|
||||
case 'T':
|
||||
tmp += '\t';
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp += str[i];
|
||||
}
|
||||
}
|
||||
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
4377
src/BuildUtil/CoreUtil/Str.cs
Normal file
4377
src/BuildUtil/CoreUtil/Str.cs
Normal file
File diff suppressed because it is too large
Load Diff
430
src/BuildUtil/CoreUtil/Tar.cs
Normal file
430
src/BuildUtil/CoreUtil/Tar.cs
Normal file
@ -0,0 +1,430 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct TarHeader
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
|
||||
public byte[] Name;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] Mode;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] UID;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] GID;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] Size;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] MTime;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] CheckSum;
|
||||
|
||||
public byte TypeFlag;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
|
||||
public byte[] LinkName;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
||||
public byte[] Magic;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
|
||||
public byte[] Version;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] UName;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] GName;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] DevMajor;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] DevMinor;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 155)]
|
||||
public byte[] Prefix;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] Padding;
|
||||
|
||||
public TarHeader(bool dummy)
|
||||
{
|
||||
this.Name = new byte[100];
|
||||
this.Mode = new byte[8];
|
||||
this.UID = new byte[8];
|
||||
this.GID = new byte[8];
|
||||
this.Size = new byte[12];
|
||||
this.MTime = new byte[12];
|
||||
this.CheckSum = new byte[8];
|
||||
this.LinkName = new byte[100];
|
||||
this.Magic = new byte[6];
|
||||
this.Version = new byte[2];
|
||||
this.UName = new byte[32];
|
||||
this.GName = new byte[32];
|
||||
this.DevMajor = new byte[8];
|
||||
this.DevMinor = new byte[8];
|
||||
this.Prefix = new byte[155];
|
||||
this.Padding = new byte[12];
|
||||
this.TypeFlag = 0;
|
||||
|
||||
this.Version[0] = 0x20;
|
||||
this.Version[1] = 0x00;
|
||||
|
||||
byte[] data = Str.ShiftJisEncoding.GetBytes("ustar ");
|
||||
Util.CopyByte(this.Magic, 0, data, 0, 6);
|
||||
}
|
||||
|
||||
public void SetName(string name, Encoding encoding)
|
||||
{
|
||||
byte[] data = encoding.GetBytes(name);
|
||||
if (data.Length <= 100)
|
||||
{
|
||||
Util.CopyByte(this.Name, 0, data, 0, data.Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
Util.CopyByte(this.Name, 0, data, 0, 100);
|
||||
Util.CopyByte(this.Prefix, 0, data, 100, data.Length - 100);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetMode(string str)
|
||||
{
|
||||
StrToByteArray(this.Mode, str);
|
||||
}
|
||||
|
||||
public void SetUID(string str)
|
||||
{
|
||||
StrToByteArray(this.UID, str);
|
||||
}
|
||||
|
||||
public void SetGID(string str)
|
||||
{
|
||||
StrToByteArray(this.GID, str);
|
||||
}
|
||||
|
||||
public void SetSize(long size)
|
||||
{
|
||||
if (size >= 0x1FFFFFFFF || size < 0)
|
||||
{
|
||||
throw new InvalidDataException("size");
|
||||
}
|
||||
StrToByteArray(this.Size, Str.AppendZeroToNumString(Convert.ToString(size, 8), 11));
|
||||
}
|
||||
|
||||
public void SetMTime(DateTime dt)
|
||||
{
|
||||
uint t = Util.DateTimeToUnixTime(dt.ToUniversalTime());
|
||||
|
||||
StrToByteArray(this.MTime, Str.AppendZeroToNumString(Convert.ToString(t, 8), 11));
|
||||
}
|
||||
|
||||
public void CalcChecksum()
|
||||
{
|
||||
TarHeader h2 = this;
|
||||
Array.Clear(h2.CheckSum, 0, h2.CheckSum.Length);
|
||||
byte[] data = Util.StructToByte(h2);
|
||||
SetChecksum(data);
|
||||
}
|
||||
|
||||
public void SetChecksum(byte[] data)
|
||||
{
|
||||
ulong sum = 0;
|
||||
int i;
|
||||
for (i = 0; i < data.Length; i++)
|
||||
{
|
||||
sum += (ulong)data[i];
|
||||
}
|
||||
|
||||
sum += 0x100;
|
||||
|
||||
StrToByteArray(this.CheckSum, Str.AppendZeroToNumString(Convert.ToString((long)sum, 8), 6));
|
||||
this.CheckSum[7] = 0x20;
|
||||
}
|
||||
|
||||
public void SetTypeFlag(int flag)
|
||||
{
|
||||
this.TypeFlag = (byte)flag.ToString()[0];
|
||||
}
|
||||
|
||||
public void SetUName(string str)
|
||||
{
|
||||
StrToByteArray(this.UName, str);
|
||||
}
|
||||
|
||||
public void SetGName(string str)
|
||||
{
|
||||
StrToByteArray(this.GName, str);
|
||||
}
|
||||
|
||||
public static void StrToByteArray(byte[] dst, string str)
|
||||
{
|
||||
Encoding e = Str.ShiftJisEncoding;
|
||||
|
||||
byte[] d = e.GetBytes(str);
|
||||
|
||||
Array.Clear(dst, 0, dst.Length);
|
||||
Util.CopyByte(dst, 0, d, 0, Math.Min(d.Length, dst.Length - 1));
|
||||
}
|
||||
}
|
||||
|
||||
public static class TarUtil
|
||||
{
|
||||
public static TarHeader CreateTarHeader(string name, Encoding encoding, int type, long size, DateTime dt)
|
||||
{
|
||||
return CreateTarHeader(name, encoding, type, size, dt, "0000777");
|
||||
}
|
||||
|
||||
public static TarHeader CreateTarHeader(string name, Encoding encoding, int type, long size, DateTime dt, string mode)
|
||||
{
|
||||
TarHeader h = new TarHeader(false);
|
||||
|
||||
h.SetName(name, encoding);
|
||||
|
||||
h.SetMode(mode);
|
||||
h.SetMTime(dt);
|
||||
h.SetName(name, encoding);
|
||||
h.SetSize(size);
|
||||
h.SetTypeFlag(type);
|
||||
h.SetGID("0000000");
|
||||
h.SetUID("0000000");
|
||||
|
||||
h.CalcChecksum();
|
||||
|
||||
return h;
|
||||
}
|
||||
}
|
||||
|
||||
public class TarPacker
|
||||
{
|
||||
Fifo fifo;
|
||||
Dictionary<string, int> dirList;
|
||||
Encoding encoding;
|
||||
|
||||
public TarPacker()
|
||||
: this(Str.ShiftJisEncoding)
|
||||
{
|
||||
}
|
||||
public TarPacker(Encoding encoding)
|
||||
{
|
||||
fifo = new Fifo();
|
||||
dirList = new Dictionary<string, int>(new StrEqualityComparer(true));
|
||||
this.encoding = encoding;
|
||||
}
|
||||
|
||||
public void AddDirectory(string name, DateTime dt, string mode)
|
||||
{
|
||||
name = name.Replace('\\', '/');
|
||||
if (name.EndsWith("/") == false)
|
||||
{
|
||||
name = name + "/";
|
||||
}
|
||||
|
||||
if (dirList.ContainsKey(name) == false)
|
||||
{
|
||||
TarHeader h = TarUtil.CreateTarHeader(name, encoding, 5, 0, dt, mode);
|
||||
fifo.Write(Util.StructToByte(h));
|
||||
|
||||
dirList.Add(name, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddDirectory(string name, DateTime dt)
|
||||
{
|
||||
AddDirectory(name, dt, "0000777");
|
||||
}
|
||||
|
||||
long currentFileSize = 0;
|
||||
long currentPos = 0;
|
||||
|
||||
public void AddFileSimple(string name, byte[] data, int pos, int len, DateTime dt)
|
||||
{
|
||||
AddFileSimple(name, data, pos, len, dt, "0000777", "0000777");
|
||||
}
|
||||
|
||||
public void AddFileSimple(string name, byte[] data, int pos, int len, DateTime dt, string directory_mode, string mode)
|
||||
{
|
||||
AddFileStart(name, len, dt, directory_mode, mode);
|
||||
AddFileData(data, pos, len);
|
||||
}
|
||||
|
||||
public void AddFileStart(string name, long size, DateTime dt)
|
||||
{
|
||||
AddFileStart(name, size, dt, "0000777", "0000777");
|
||||
}
|
||||
|
||||
public void AddFileStart(string name, long size, DateTime dt, string directory_mode, string mode)
|
||||
{
|
||||
if (currentFileSize != 0 || currentPos != 0)
|
||||
{
|
||||
throw new ApplicationException("last file not completed.");
|
||||
}
|
||||
|
||||
name = name.Replace('\\', '/');
|
||||
if (Str.InStr(name, "/", true))
|
||||
{
|
||||
AddDirectory(Path.GetDirectoryName(name), dt, directory_mode);
|
||||
}
|
||||
|
||||
TarHeader h = TarUtil.CreateTarHeader(name, encoding, 0, size, dt, mode);
|
||||
fifo.Write(Util.StructToByte(h));
|
||||
|
||||
currentFileSize = size;
|
||||
currentPos = 0;
|
||||
}
|
||||
|
||||
public void AddFileData(byte[] data, int pos, int len)
|
||||
{
|
||||
long totalSize = currentPos + len;
|
||||
|
||||
if (totalSize > currentFileSize)
|
||||
{
|
||||
throw new ApplicationException("totalSize > currentFileSize");
|
||||
}
|
||||
|
||||
fifo.Write(data, pos, len);
|
||||
|
||||
currentPos += len;
|
||||
if (currentPos >= currentFileSize)
|
||||
{
|
||||
long padding = ((currentFileSize + 511) / 512) * 512 - currentFileSize;
|
||||
|
||||
byte[] pad = new byte[padding];
|
||||
Array.Clear(pad, 0, pad.Length);
|
||||
fifo.Write(pad, 0, pad.Length);
|
||||
|
||||
currentFileSize = 0;
|
||||
currentPos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public Fifo GeneratedData
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.fifo;
|
||||
}
|
||||
}
|
||||
|
||||
public void Finish()
|
||||
{
|
||||
byte[] data = new byte[1024];
|
||||
Array.Clear(data, 0, data.Length);
|
||||
|
||||
fifo.Write(data);
|
||||
}
|
||||
|
||||
public byte[] CompressToGZip()
|
||||
{
|
||||
GZipPacker g = new GZipPacker();
|
||||
byte[] data = this.fifo.Read();
|
||||
|
||||
g.Write(data, 0, data.Length, true);
|
||||
|
||||
return g.GeneratedData.Read();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
542
src/BuildUtil/CoreUtil/Thread.cs
Normal file
542
src/BuildUtil/CoreUtil/Thread.cs
Normal file
@ -0,0 +1,542 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Net.Mail;
|
||||
using System.Net.Mime;
|
||||
using CoreUtil;
|
||||
|
||||
#pragma warning disable 0618
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
class WorkerQueuePrivate
|
||||
{
|
||||
object lockObj = new object();
|
||||
|
||||
List<ThreadObj> thread_list;
|
||||
ThreadProc thread_proc;
|
||||
int num_worker_threads;
|
||||
Queue<object> taskQueue = new Queue<object>();
|
||||
Exception raised_exception = null;
|
||||
|
||||
void worker_thread(object param)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
object task = null;
|
||||
|
||||
lock (lockObj)
|
||||
{
|
||||
if (taskQueue.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
task = taskQueue.Dequeue();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
this.thread_proc(task);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (raised_exception == null)
|
||||
{
|
||||
raised_exception = ex;
|
||||
}
|
||||
|
||||
Console.WriteLine(ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public WorkerQueuePrivate(ThreadProc thread_proc, int num_worker_threads, object[] tasks)
|
||||
{
|
||||
thread_list = new List<ThreadObj>();
|
||||
int i;
|
||||
|
||||
this.thread_proc = thread_proc;
|
||||
this.num_worker_threads = num_worker_threads;
|
||||
|
||||
foreach (object task in tasks)
|
||||
{
|
||||
taskQueue.Enqueue(task);
|
||||
}
|
||||
|
||||
raised_exception = null;
|
||||
|
||||
for (i = 0; i < num_worker_threads; i++)
|
||||
{
|
||||
ThreadObj t = new ThreadObj(worker_thread);
|
||||
|
||||
thread_list.Add(t);
|
||||
}
|
||||
|
||||
foreach (ThreadObj t in thread_list)
|
||||
{
|
||||
t.WaitForEnd();
|
||||
}
|
||||
|
||||
if (raised_exception != null)
|
||||
{
|
||||
throw raised_exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Tick64
|
||||
{
|
||||
static object lock_obj = new object();
|
||||
static uint last_value = 0;
|
||||
static bool is_first = true;
|
||||
static uint num_round = 0;
|
||||
|
||||
public static long Value
|
||||
{
|
||||
get
|
||||
{
|
||||
unchecked
|
||||
{
|
||||
lock (lock_obj)
|
||||
{
|
||||
uint current_value = (uint)(System.Environment.TickCount + 3864700935);
|
||||
|
||||
if (is_first)
|
||||
{
|
||||
last_value = current_value;
|
||||
is_first = false;
|
||||
}
|
||||
|
||||
if (last_value > current_value)
|
||||
{
|
||||
num_round++;
|
||||
}
|
||||
|
||||
last_value = current_value;
|
||||
|
||||
ulong ret = 4294967296UL * (ulong)num_round + current_value;
|
||||
|
||||
return (long)ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static uint ValueUInt32
|
||||
{
|
||||
get
|
||||
{
|
||||
unchecked
|
||||
{
|
||||
return (uint)((ulong)Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class Event
|
||||
{
|
||||
EventWaitHandle h;
|
||||
public const int Infinite = Timeout.Infinite;
|
||||
|
||||
public Event()
|
||||
{
|
||||
init(false);
|
||||
}
|
||||
|
||||
public Event(bool manualReset)
|
||||
{
|
||||
init(manualReset);
|
||||
}
|
||||
|
||||
void init(bool manualReset)
|
||||
{
|
||||
h = new EventWaitHandle(false, (manualReset ? EventResetMode.ManualReset : EventResetMode.AutoReset));
|
||||
}
|
||||
|
||||
public void Set()
|
||||
{
|
||||
h.Set();
|
||||
}
|
||||
|
||||
public bool Wait()
|
||||
{
|
||||
return Wait(Infinite);
|
||||
}
|
||||
public bool Wait(int millisecs)
|
||||
{
|
||||
return h.WaitOne(millisecs, false);
|
||||
}
|
||||
|
||||
static EventWaitHandle[] toArray(Event[] events)
|
||||
{
|
||||
List<EventWaitHandle> list = new List<EventWaitHandle>();
|
||||
|
||||
foreach (Event e in events)
|
||||
{
|
||||
list.Add(e.h);
|
||||
}
|
||||
|
||||
return list.ToArray();
|
||||
}
|
||||
|
||||
public static bool WaitAll(Event[] events)
|
||||
{
|
||||
return WaitAll(events, Infinite);
|
||||
}
|
||||
public static bool WaitAll(Event[] events, int millisecs)
|
||||
{
|
||||
if (events.Length <= 64)
|
||||
{
|
||||
return waitAllInner(events, millisecs);
|
||||
}
|
||||
else
|
||||
{
|
||||
return waitAllMulti(events, millisecs);
|
||||
}
|
||||
}
|
||||
|
||||
static bool waitAllMulti(Event[] events, int millisecs)
|
||||
{
|
||||
int numBlocks = (events.Length + 63) / 64;
|
||||
List<Event>[] list = new List<Event>[numBlocks];
|
||||
int i;
|
||||
for (i = 0; i < numBlocks; i++)
|
||||
{
|
||||
list[i] = new List<Event>();
|
||||
}
|
||||
for (i = 0; i < events.Length; i++)
|
||||
{
|
||||
list[i / 64].Add(events[i]);
|
||||
}
|
||||
|
||||
double start = Time.NowDouble;
|
||||
double giveup = start + (double)millisecs / 1000.0;
|
||||
foreach (List<Event> o in list)
|
||||
{
|
||||
double now = Time.NowDouble;
|
||||
if (now <= giveup || millisecs < 0)
|
||||
{
|
||||
int waitmsecs;
|
||||
if (millisecs >= 0)
|
||||
{
|
||||
waitmsecs = (int)((giveup - now) * 1000.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
waitmsecs = Timeout.Infinite;
|
||||
}
|
||||
|
||||
bool ret = waitAllInner(o.ToArray(), waitmsecs);
|
||||
if (ret == false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool waitAllInner(Event[] events, int millisecs)
|
||||
{
|
||||
if (events.Length == 1)
|
||||
{
|
||||
return events[0].Wait(millisecs);
|
||||
}
|
||||
return EventWaitHandle.WaitAll(toArray(events), millisecs, false);
|
||||
}
|
||||
|
||||
public static bool WaitAny(Event[] events)
|
||||
{
|
||||
return WaitAny(events, Infinite);
|
||||
}
|
||||
public static bool WaitAny(Event[] events, int millisecs)
|
||||
{
|
||||
if (events.Length == 1)
|
||||
{
|
||||
return events[0].Wait(millisecs);
|
||||
}
|
||||
return ((WaitHandle.WaitTimeout == EventWaitHandle.WaitAny(toArray(events), millisecs, false)) ? false : true);
|
||||
}
|
||||
|
||||
public IntPtr Handle
|
||||
{
|
||||
get
|
||||
{
|
||||
return h.Handle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ThreadData
|
||||
{
|
||||
static LocalDataStoreSlot slot = Thread.AllocateDataSlot();
|
||||
|
||||
public readonly SortedDictionary<string, object> DataList = new SortedDictionary<string, object>();
|
||||
|
||||
public static ThreadData CurrentThreadData
|
||||
{
|
||||
get
|
||||
{
|
||||
return GetCurrentThreadData();
|
||||
}
|
||||
}
|
||||
|
||||
public static ThreadData GetCurrentThreadData()
|
||||
{
|
||||
ThreadData t;
|
||||
|
||||
try
|
||||
{
|
||||
t = (ThreadData)Thread.GetData(slot);
|
||||
}
|
||||
catch
|
||||
{
|
||||
t = null;
|
||||
}
|
||||
|
||||
if (t == null)
|
||||
{
|
||||
t = new ThreadData();
|
||||
|
||||
Thread.SetData(slot, t);
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
public delegate void ThreadProc(object userObject);
|
||||
|
||||
public class ThreadObj
|
||||
{
|
||||
static int defaultStackSize = 100000;
|
||||
|
||||
static LocalDataStoreSlot currentObjSlot = Thread.AllocateDataSlot();
|
||||
|
||||
public const int Infinite = Timeout.Infinite;
|
||||
|
||||
ThreadProc proc;
|
||||
Thread thread;
|
||||
EventWaitHandle waitInit;
|
||||
EventWaitHandle waitEnd;
|
||||
EventWaitHandle waitInitForUser;
|
||||
public Thread Thread
|
||||
{
|
||||
get { return thread; }
|
||||
}
|
||||
object userObject;
|
||||
|
||||
public ThreadObj(ThreadProc threadProc)
|
||||
{
|
||||
init(threadProc, null, 0);
|
||||
}
|
||||
|
||||
public ThreadObj(ThreadProc threadProc, int stacksize)
|
||||
{
|
||||
init(threadProc, null, stacksize);
|
||||
}
|
||||
|
||||
public ThreadObj(ThreadProc threadProc, object userObject)
|
||||
{
|
||||
init(threadProc, userObject, 0);
|
||||
}
|
||||
|
||||
public ThreadObj(ThreadProc threadProc, object userObject, int stacksize)
|
||||
{
|
||||
init(threadProc, userObject, stacksize);
|
||||
}
|
||||
|
||||
void init(ThreadProc threadProc, object userObject, int stacksize)
|
||||
{
|
||||
if (stacksize == 0)
|
||||
{
|
||||
stacksize = defaultStackSize;
|
||||
}
|
||||
|
||||
this.proc = threadProc;
|
||||
this.userObject = userObject;
|
||||
waitInit = new EventWaitHandle(false, EventResetMode.AutoReset);
|
||||
waitEnd = new EventWaitHandle(false, EventResetMode.ManualReset);
|
||||
waitInitForUser = new EventWaitHandle(false, EventResetMode.ManualReset);
|
||||
this.thread = new Thread(new ParameterizedThreadStart(commonThreadProc), stacksize);
|
||||
this.thread.Start(this);
|
||||
waitInit.WaitOne();
|
||||
}
|
||||
|
||||
public static int DefaultStackSize
|
||||
{
|
||||
get
|
||||
{
|
||||
return defaultStackSize;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
defaultStackSize = value;
|
||||
}
|
||||
}
|
||||
|
||||
void commonThreadProc(object obj)
|
||||
{
|
||||
Thread.SetData(currentObjSlot, this);
|
||||
|
||||
waitInit.Set();
|
||||
|
||||
try
|
||||
{
|
||||
this.proc(this.userObject);
|
||||
}
|
||||
finally
|
||||
{
|
||||
waitEnd.Set();
|
||||
}
|
||||
}
|
||||
|
||||
public static ThreadObj GetCurrentThreadObj()
|
||||
{
|
||||
return (ThreadObj)Thread.GetData(currentObjSlot);
|
||||
}
|
||||
|
||||
public static void NoticeInited()
|
||||
{
|
||||
GetCurrentThreadObj().waitInitForUser.Set();
|
||||
}
|
||||
|
||||
public void WaitForInit()
|
||||
{
|
||||
waitInitForUser.WaitOne();
|
||||
}
|
||||
|
||||
public void WaitForEnd(int timeout)
|
||||
{
|
||||
waitEnd.WaitOne(timeout, false);
|
||||
}
|
||||
public void WaitForEnd()
|
||||
{
|
||||
waitEnd.WaitOne();
|
||||
}
|
||||
|
||||
public static void Sleep(int millisec)
|
||||
{
|
||||
if (millisec == 0x7fffffff)
|
||||
{
|
||||
millisec = ThreadObj.Infinite;
|
||||
}
|
||||
|
||||
Thread.Sleep(millisec);
|
||||
}
|
||||
|
||||
public static void Yield()
|
||||
{
|
||||
Thread.Sleep(0);
|
||||
}
|
||||
|
||||
public static void ProcessWorkQueue(ThreadProc thread_proc, int num_worker_threads, object[] tasks)
|
||||
{
|
||||
WorkerQueuePrivate q = new WorkerQueuePrivate(thread_proc, num_worker_threads, tasks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
174
src/BuildUtil/CoreUtil/Time.cs
Normal file
174
src/BuildUtil/CoreUtil/Time.cs
Normal file
@ -0,0 +1,174 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Diagnostics;
|
||||
using System.Web.Mail;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
class TimeHelper
|
||||
{
|
||||
internal Stopwatch Sw;
|
||||
internal long Freq;
|
||||
internal DateTime FirstDateTime;
|
||||
|
||||
public TimeHelper()
|
||||
{
|
||||
FirstDateTime = DateTime.Now;
|
||||
Sw = new Stopwatch();
|
||||
Sw.Start();
|
||||
Freq = Stopwatch.Frequency;
|
||||
}
|
||||
|
||||
public DateTime GetDateTime()
|
||||
{
|
||||
return FirstDateTime + this.Sw.Elapsed;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Time
|
||||
{
|
||||
static TimeHelper h = new TimeHelper();
|
||||
static TimeSpan baseTimeSpan = new TimeSpan(0, 0, 1);
|
||||
|
||||
static public TimeSpan NowTimeSpan
|
||||
{
|
||||
get
|
||||
{
|
||||
return h.Sw.Elapsed.Add(baseTimeSpan);
|
||||
}
|
||||
}
|
||||
|
||||
static public long NowLong100Usecs
|
||||
{
|
||||
get
|
||||
{
|
||||
return NowTimeSpan.Ticks;
|
||||
}
|
||||
}
|
||||
|
||||
static public long NowLongMillisecs
|
||||
{
|
||||
get
|
||||
{
|
||||
return NowLong100Usecs / 10000;
|
||||
}
|
||||
}
|
||||
|
||||
static public long Tick64
|
||||
{
|
||||
get
|
||||
{
|
||||
return NowLongMillisecs;
|
||||
}
|
||||
}
|
||||
|
||||
static public double NowDouble
|
||||
{
|
||||
get
|
||||
{
|
||||
return (double)NowLong100Usecs / (double)10000000.0;
|
||||
}
|
||||
}
|
||||
|
||||
static public DateTime NowDateTime
|
||||
{
|
||||
get
|
||||
{
|
||||
return h.GetDateTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
1034
src/BuildUtil/CoreUtil/Util.cs
Normal file
1034
src/BuildUtil/CoreUtil/Util.cs
Normal file
File diff suppressed because it is too large
Load Diff
303
src/BuildUtil/CoreUtil/Win32.cs
Normal file
303
src/BuildUtil/CoreUtil/Win32.cs
Normal file
@ -0,0 +1,303 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Web.Mail;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Xml.Serialization;
|
||||
using System.DirectoryServices;
|
||||
using CoreUtil;
|
||||
using CoreUtil.Internal;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
public static class Win32
|
||||
{
|
||||
static Win32()
|
||||
{
|
||||
}
|
||||
|
||||
public static void CreateUser(string machineName, string userName, string password, string description)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
Str.NormalizeString(ref password);
|
||||
Str.NormalizeString(ref description);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry newUser = sam.Children.Add(userName, "user"))
|
||||
{
|
||||
newUser.Invoke("SetPassword", new object[] { password });
|
||||
newUser.Invoke("Put", new object[] { "Description", description });
|
||||
newUser.CommitChanges();
|
||||
Console.WriteLine(newUser.Path);
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
AddUserToGroup(machineName, userName, "Users");
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public static void ChangeUserPassword(string machineName, string userName, string oldPassword, string newPassword)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
Str.NormalizeString(ref oldPassword);
|
||||
Str.NormalizeString(ref newPassword);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry user = sam.Children.Find(userName, "user"))
|
||||
{
|
||||
user.Invoke("ChangePassword", oldPassword, newPassword);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetUserPassword(string machineName, string userName, string password)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
Str.NormalizeString(ref password);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry user = sam.Children.Find(userName, "user"))
|
||||
{
|
||||
user.Invoke("SetPassword", password);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] GetMembersOfGroup(string machineName, string groupName)
|
||||
{
|
||||
List<string> ret = new List<string>();
|
||||
|
||||
Str.NormalizeString(ref groupName);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry g = sam.Children.Find(groupName, "group"))
|
||||
{
|
||||
object members = g.Invoke("Members", null);
|
||||
|
||||
foreach (object member in (IEnumerable)members)
|
||||
{
|
||||
using (DirectoryEntry e = new DirectoryEntry(member))
|
||||
{
|
||||
ret.Add(e.Name);
|
||||
}
|
||||
}
|
||||
|
||||
return ret.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsUserMemberOfGroup(string machineName, string userName, string groupName)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
Str.NormalizeString(ref groupName);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry g = sam.Children.Find(groupName, "group"))
|
||||
{
|
||||
using (DirectoryEntry u = sam.Children.Find(userName, "user"))
|
||||
{
|
||||
return (bool)g.Invoke("IsMember", u.Path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DeleteUserFromGroup(string machineName, string userName, string groupName)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
Str.NormalizeString(ref groupName);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry g = sam.Children.Find(groupName, "group"))
|
||||
{
|
||||
using (DirectoryEntry u = sam.Children.Find(userName, "user"))
|
||||
{
|
||||
g.Invoke("Remove", u.Path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddUserToGroup(string machineName, string userName, string groupName)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
Str.NormalizeString(ref groupName);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry g = sam.Children.Find(groupName, "group"))
|
||||
{
|
||||
using (DirectoryEntry u = sam.Children.Find(userName, "user"))
|
||||
{
|
||||
g.Invoke("Add", u.Path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DeleteUser(string machineName, string userName)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
using (DirectoryEntry u = sam.Children.Find(userName, "user"))
|
||||
{
|
||||
sam.Children.Remove(u);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsUserExists(string machineName, string userName)
|
||||
{
|
||||
Str.NormalizeString(ref userName);
|
||||
|
||||
using (DirectoryEntry sam = OpenSam(machineName))
|
||||
{
|
||||
try
|
||||
{
|
||||
using (DirectoryEntry user = sam.Children.Find(userName, "user"))
|
||||
{
|
||||
if (user == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (COMException ce)
|
||||
{
|
||||
if ((uint)ce.ErrorCode == 0x800708AD)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static DirectoryEntry OpenSam()
|
||||
{
|
||||
return OpenSam(null);
|
||||
}
|
||||
public static DirectoryEntry OpenSam(string machineName)
|
||||
{
|
||||
if (Str.IsEmptyStr(machineName))
|
||||
{
|
||||
machineName = Env.MachineName;
|
||||
}
|
||||
|
||||
return new DirectoryEntry(string.Format("WinNT://{0},computer",
|
||||
machineName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
5609
src/BuildUtil/CoreUtil/ZLib.cs
Normal file
5609
src/BuildUtil/CoreUtil/ZLib.cs
Normal file
File diff suppressed because it is too large
Load Diff
482
src/BuildUtil/CoreUtil/Zip.cs
Normal file
482
src/BuildUtil/CoreUtil/Zip.cs
Normal file
@ -0,0 +1,482 @@
|
||||
// CoreUtil
|
||||
//
|
||||
// Copyright (C) 2012-2014 Daiyuu Nobori. All Rights Reserved.
|
||||
// Copyright (C) 2012-2014 SoftEther VPN Project at University of Tsukuba. All Rights Reserved.
|
||||
// Comments: Tetsuo Sugiyama, Ph.D.
|
||||
//
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// version 2 as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version 2
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// THE LICENSE AGREEMENT IS ATTACHED ON THE SOURCE-CODE PACKAGE
|
||||
// AS "LICENSE.TXT" FILE. READ THE TEXT FILE IN ADVANCE TO USE THE SOFTWARE.
|
||||
//
|
||||
//
|
||||
// THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN,
|
||||
// UNDER JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY,
|
||||
// MERGE, PUBLISH, DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS
|
||||
// SOFTWARE, THAT ANY JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS
|
||||
// SOFTWARE OR ITS CONTENTS, AGAINST US (SOFTETHER PROJECT, SOFTETHER
|
||||
// CORPORATION, DAIYUU NOBORI OR OTHER SUPPLIERS), OR ANY JURIDICAL
|
||||
// DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND OF USING, COPYING,
|
||||
// MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING, AND/OR
|
||||
// SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
|
||||
// CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO
|
||||
// EXCLUSIVE JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO,
|
||||
// JAPAN. YOU MUST WAIVE ALL DEFENSES OF LACK OF PERSONAL JURISDICTION
|
||||
// AND FORUM NON CONVENIENS. PROCESS MAY BE SERVED ON EITHER PARTY IN
|
||||
// THE MANNER AUTHORIZED BY APPLICABLE LAW OR COURT RULE.
|
||||
//
|
||||
// USE ONLY IN JAPAN. DO NOT USE IT IN OTHER COUNTRIES. IMPORTING THIS
|
||||
// SOFTWARE INTO OTHER COUNTRIES IS AT YOUR OWN RISK. SOME COUNTRIES
|
||||
// PROHIBIT ENCRYPTED COMMUNICATIONS. USING THIS SOFTWARE IN OTHER
|
||||
// COUNTRIES MIGHT BE RESTRICTED.
|
||||
//
|
||||
//
|
||||
// DEAR SECURITY EXPERTS
|
||||
// ---------------------
|
||||
//
|
||||
// If you find a bug or a security vulnerability please kindly inform us
|
||||
// about the problem immediately so that we can fix the security problem
|
||||
// to protect a lot of users around the world as soon as possible.
|
||||
//
|
||||
// Our e-mail address for security reports is:
|
||||
// softether-vpn-security [at] softether.org
|
||||
//
|
||||
// Please note that the above e-mail address is not a technical support
|
||||
// inquiry address. If you need technical assistance, please visit
|
||||
// http://www.softether.org/ and ask your question on the users forum.
|
||||
//
|
||||
// Thank you for your cooperation.
|
||||
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Data;
|
||||
using System.Data.Sql;
|
||||
using System.Data.SqlClient;
|
||||
using System.Data.SqlTypes;
|
||||
using System.Text;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CoreUtil
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct ZipDataHeader
|
||||
{
|
||||
public uint Signature;
|
||||
public ushort NeedVer;
|
||||
public ushort Option;
|
||||
public ushort CompType;
|
||||
public ushort FileTime;
|
||||
public ushort FileDate;
|
||||
public uint Crc32;
|
||||
public uint CompSize;
|
||||
public uint UncompSize;
|
||||
public ushort FileNameLen;
|
||||
public ushort ExtraLen;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct ZipDataFooter
|
||||
{
|
||||
public uint Signature;
|
||||
public uint Crc32;
|
||||
public uint CompSize;
|
||||
public uint UncompSize;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct ZipDirHeader
|
||||
{
|
||||
public uint Signature;
|
||||
public ushort MadeVer;
|
||||
public ushort NeedVer;
|
||||
public ushort Option;
|
||||
public ushort CompType;
|
||||
public ushort FileTime;
|
||||
public ushort FileDate;
|
||||
public uint Crc32;
|
||||
public uint CompSize;
|
||||
public uint UncompSize;
|
||||
public ushort FileNameLen;
|
||||
public ushort ExtraLen;
|
||||
public ushort CommentLen;
|
||||
public ushort DiskNum;
|
||||
public ushort InAttr;
|
||||
public uint OutAttr;
|
||||
public uint HeaderPos;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct ZipEndHeader
|
||||
{
|
||||
public uint Signature;
|
||||
public ushort DiskNum;
|
||||
public ushort StartDiskNum;
|
||||
public ushort DiskDirEntry;
|
||||
public ushort DirEntry;
|
||||
public uint DirSize;
|
||||
public uint StartPos;
|
||||
public ushort CommentLen;
|
||||
}
|
||||
|
||||
public static class ZipUtil
|
||||
{
|
||||
static ZipUtil()
|
||||
{
|
||||
initCrc32();
|
||||
}
|
||||
|
||||
static uint[] table;
|
||||
const int crcTableSize = 256;
|
||||
|
||||
static void initCrc32()
|
||||
{
|
||||
table = new uint[crcTableSize];
|
||||
|
||||
uint poly = 0xEDB88320;
|
||||
uint u, i, j;
|
||||
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
u = i;
|
||||
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
if ((u & 0x1) != 0)
|
||||
{
|
||||
u = (u >> 1) ^ poly;
|
||||
}
|
||||
else
|
||||
{
|
||||
u >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
table[i] = u;
|
||||
}
|
||||
}
|
||||
|
||||
public static uint Crc32(byte[] buf)
|
||||
{
|
||||
return Crc32(buf, 0, buf.Length);
|
||||
}
|
||||
public static uint Crc32(byte[] buf, int pos, int len)
|
||||
{
|
||||
return Crc32Finish(Crc32First(buf, pos, len));
|
||||
}
|
||||
public static uint Crc32First(byte[] buf, int pos, int len)
|
||||
{
|
||||
return Crc32Next(buf, pos, len, 0xffffffff);
|
||||
}
|
||||
public static uint Crc32Next(byte[] buf, int pos, int len, uint lastCrc32)
|
||||
{
|
||||
uint ret = lastCrc32;
|
||||
for (uint i = 0; i < len; i++)
|
||||
{
|
||||
ret = (ret >> 8) ^ table[buf[pos + i] ^ (ret & 0xff)];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
public static uint Crc32Finish(uint lastCrc32)
|
||||
{
|
||||
return ~lastCrc32;
|
||||
}
|
||||
}
|
||||
|
||||
public class ZipPacker
|
||||
{
|
||||
public const uint Signature = 0x04034B50;
|
||||
public const uint SignatureEnd = 0x06054B50;
|
||||
public const ushort Version = 10;
|
||||
public const ushort VersionWithCompress = 20;
|
||||
public Encoding Encoding = Str.ShiftJisEncoding;
|
||||
|
||||
class File
|
||||
{
|
||||
public string Name;
|
||||
public long Size;
|
||||
public DateTime DateTime;
|
||||
public FileAttributes Attributes;
|
||||
public long CurrentSize;
|
||||
public long CompressSize;
|
||||
public uint Crc32;
|
||||
public uint HeaderPos;
|
||||
public Encoding Encoding;
|
||||
public bool Compress;
|
||||
public CoreUtil.Internal.ZStream ZStream;
|
||||
|
||||
public void WriteZipDataHeader(ref ZipDataHeader h, bool writeSizes)
|
||||
{
|
||||
h.Signature = Signature;
|
||||
h.NeedVer = Version;
|
||||
h.CompType = 0;
|
||||
h.FileTime = Util.DateTimeToDosTime(this.DateTime);
|
||||
h.FileDate = Util.DateTimeToDosDate(this.DateTime);
|
||||
h.Option = 8;
|
||||
|
||||
if (writeSizes == false)
|
||||
{
|
||||
h.CompSize = h.UncompSize = 0;
|
||||
h.Crc32 = 0;
|
||||
|
||||
if (this.Compress)
|
||||
{
|
||||
h.NeedVer = VersionWithCompress;
|
||||
h.CompType = 8;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
h.CompSize = h.UncompSize = (uint)this.Size;
|
||||
if (this.Compress)
|
||||
{
|
||||
h.CompSize = (uint)this.CompressSize;
|
||||
h.CompType = 8;
|
||||
}
|
||||
h.Crc32 = this.Crc32;
|
||||
}
|
||||
|
||||
h.FileNameLen = (ushort)this.Encoding.GetByteCount(this.Name);
|
||||
h.ExtraLen = 0;
|
||||
}
|
||||
|
||||
public void WriteZipDataFooter(ref ZipDataFooter h)
|
||||
{
|
||||
h.Signature = 0x08074B50;
|
||||
|
||||
if (this.Compress == false)
|
||||
{
|
||||
h.CompSize = h.UncompSize = (uint)this.Size;
|
||||
}
|
||||
else
|
||||
{
|
||||
h.CompSize = (uint)this.CompressSize;
|
||||
h.UncompSize = (uint)this.Size;
|
||||
}
|
||||
h.Crc32 = this.Crc32;
|
||||
}
|
||||
}
|
||||
|
||||
Fifo fifo;
|
||||
List<File> fileList;
|
||||
|
||||
public Fifo GeneratedData
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.fifo;
|
||||
}
|
||||
}
|
||||
|
||||
public ZipPacker()
|
||||
{
|
||||
fifo = new Fifo();
|
||||
fileList = new List<File>();
|
||||
}
|
||||
|
||||
File currentFile = null;
|
||||
|
||||
public void AddFileSimple(string name, DateTime dt, FileAttributes attribute, byte[] data)
|
||||
{
|
||||
AddFileSimple(name, dt, attribute, data, false);
|
||||
}
|
||||
public void AddFileSimple(string name, DateTime dt, FileAttributes attribute, byte[] data, bool compress)
|
||||
{
|
||||
AddFileStart(name, data.Length, dt, attribute, compress);
|
||||
AddFileData(data, 0, data.Length);
|
||||
}
|
||||
|
||||
public void AddFileStart(string name, long size, DateTime dt, FileAttributes attribute)
|
||||
{
|
||||
AddFileStart(name, size, dt, attribute, false);
|
||||
}
|
||||
public void AddFileStart(string name, long size, DateTime dt, FileAttributes attribute, bool compress)
|
||||
{
|
||||
if (currentFile != null)
|
||||
{
|
||||
throw new ApplicationException("currentFile != null");
|
||||
}
|
||||
|
||||
name = name.Replace("/", "\\");
|
||||
|
||||
File f = new File();
|
||||
|
||||
f.Encoding = this.Encoding;
|
||||
f.Name = name;
|
||||
f.Size = size;
|
||||
f.DateTime = dt;
|
||||
f.Attributes = attribute;
|
||||
f.Compress = compress;
|
||||
|
||||
this.fileList.Add(f);
|
||||
|
||||
ZipDataHeader h = new ZipDataHeader();
|
||||
f.HeaderPos = (uint)fifo.TotalWriteSize;
|
||||
f.WriteZipDataHeader(ref h, false);
|
||||
fifo.Write(Util.StructToByte(h));
|
||||
fifo.Write(this.Encoding.GetBytes(f.Name));
|
||||
f.Crc32 = 0xffffffff;
|
||||
|
||||
if (compress)
|
||||
{
|
||||
f.ZStream = new CoreUtil.Internal.ZStream();
|
||||
f.ZStream.deflateInit(-1, -15);
|
||||
}
|
||||
|
||||
currentFile = f;
|
||||
}
|
||||
|
||||
public long AddFileData(byte[] data, int pos, int len)
|
||||
{
|
||||
long totalSize = currentFile.CurrentSize + len;
|
||||
|
||||
if (totalSize > currentFile.Size)
|
||||
{
|
||||
throw new ApplicationException("totalSize > currentFile.Size");
|
||||
}
|
||||
|
||||
if (currentFile.Compress == false)
|
||||
{
|
||||
fifo.Write(data, pos, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
CoreUtil.Internal.ZStream zs = currentFile.ZStream;
|
||||
|
||||
byte[] srcData = Util.ExtractByteArray(data, pos, len);
|
||||
byte[] dstData = new byte[srcData.Length * 2 + 100];
|
||||
|
||||
zs.next_in = srcData;
|
||||
zs.avail_in = srcData.Length;
|
||||
zs.next_in_index = 0;
|
||||
|
||||
zs.next_out = dstData;
|
||||
zs.avail_out = dstData.Length;
|
||||
zs.next_out_index = 0;
|
||||
|
||||
if (currentFile.Size == (currentFile.CurrentSize + len))
|
||||
{
|
||||
zs.deflate(CoreUtil.Internal.zlibConst.Z_FINISH);
|
||||
}
|
||||
else
|
||||
{
|
||||
zs.deflate(CoreUtil.Internal.zlibConst.Z_SYNC_FLUSH);
|
||||
}
|
||||
|
||||
fifo.Write(dstData, 0, dstData.Length - zs.avail_out);
|
||||
|
||||
currentFile.CompressSize += dstData.Length - zs.avail_out;
|
||||
|
||||
Util.NoOP();
|
||||
}
|
||||
|
||||
currentFile.CurrentSize += len;
|
||||
|
||||
currentFile.Crc32 = ZipUtil.Crc32Next(data, pos, len, currentFile.Crc32);
|
||||
|
||||
long ret = currentFile.Size - currentFile.CurrentSize;
|
||||
|
||||
if (ret == 0)
|
||||
{
|
||||
currentFile.Crc32 = ~currentFile.Crc32;
|
||||
addFileFooter();
|
||||
|
||||
currentFile = null;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void addFileFooter()
|
||||
{
|
||||
ZipDataFooter f = new ZipDataFooter();
|
||||
currentFile.WriteZipDataFooter(ref f);
|
||||
fifo.Write(Util.StructToByte(f));
|
||||
}
|
||||
|
||||
public void Finish()
|
||||
{
|
||||
long posStart = fifo.TotalWriteSize;
|
||||
foreach (File f in this.fileList)
|
||||
{
|
||||
ZipDirHeader d = new ZipDirHeader();
|
||||
d.Signature = 0x02014B50;// ZipPacker.Signature;
|
||||
d.MadeVer = Version;
|
||||
ZipDataHeader dh = new ZipDataHeader();
|
||||
f.WriteZipDataHeader(ref dh, true);
|
||||
if (f.Compress)
|
||||
{
|
||||
dh.CompType = 8;
|
||||
dh.CompSize = (uint)f.CompressSize;
|
||||
dh.NeedVer = ZipPacker.VersionWithCompress;
|
||||
}
|
||||
d.NeedVer = dh.NeedVer;
|
||||
d.Option = dh.Option;
|
||||
d.CompType = dh.CompType;
|
||||
d.FileTime = dh.FileTime;
|
||||
d.FileDate = dh.FileDate;
|
||||
d.Crc32 = dh.Crc32;
|
||||
d.CompSize = dh.CompSize;
|
||||
d.UncompSize = dh.UncompSize;
|
||||
d.FileNameLen = dh.FileNameLen;
|
||||
d.ExtraLen = dh.ExtraLen;
|
||||
d.CommentLen = 0;
|
||||
d.DiskNum = 0;
|
||||
d.InAttr = 0;
|
||||
d.OutAttr = (ushort)f.Attributes;
|
||||
d.HeaderPos = f.HeaderPos;
|
||||
|
||||
fifo.Write(Util.StructToByte(d));
|
||||
fifo.Write(this.Encoding.GetBytes(f.Name));
|
||||
}
|
||||
long posEnd = fifo.TotalWriteSize;
|
||||
|
||||
ZipEndHeader e = new ZipEndHeader();
|
||||
e.Signature = ZipPacker.SignatureEnd;
|
||||
e.DiskNum = e.StartDiskNum = 0;
|
||||
e.DiskDirEntry = e.DirEntry = (ushort)this.fileList.Count;
|
||||
e.DirSize = (uint)(posEnd - posStart);
|
||||
e.StartPos = (uint)posStart;
|
||||
e.CommentLen = 0;
|
||||
fifo.Write(Util.StructToByte(e));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Developed by SoftEther VPN Project at University of Tsukuba in Japan.
|
||||
// Department of Computer Science has dozens of overly-enthusiastic geeks.
|
||||
// Join us: http://www.tsukuba.ac.jp/english/admission/
|
Reference in New Issue
Block a user