1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2025-04-03 18:00:08 +03:00
SoftEtherVPN/src/BuildUtil/CoreUtil/ReadIni.cs

236 lines
4.4 KiB
C#

// CoreUtil
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;
}
}
}
}
}
}