Esempio n. 1
0
 //通常のコンストラクタ
 public MlUsers(Kernel kernel, Logger logger, OneOption op)
 {
     this.kernel = kernel;
     this.logger = logger;
     this.op = op;
     Init((Dat)op.GetValue("memberList"));//初期化
 }
Esempio n. 2
0
 //通常のコンストラクタ
 public MlUsers(Kernel kernel, Logger logger, OneOption op)
 {
     this.kernel = kernel;
     this.logger = logger;
     this.op     = op;
     Init((Dat)op.GetValue("memberList"));//初期化
 }
Esempio n. 3
0
        void OnGUI()
        {
            GUIUtil.PushSkin(m_Skin);

            Rect wndRect = new Rect(0, Screen.height - WND_HEIGHT, Screen.width, WND_HEIGHT);

            GUI.Box(wndRect, "");
            GUILayout.BeginArea(wndRect);
            {
                GUILayout.Label(m_AllOptions.m_Prompt);

                m_scrollPos = GUILayout.BeginScrollView(m_scrollPos);
                {
                    List <OneOption> opts = m_AllOptions.m_Options;
                    for (int idx = 0; idx < opts.Count; ++idx)
                    {
                        OneOption oneOpt = opts[idx];
                        if (GUILayout.Button(oneOpt.m_Text))
                        {
                            SelectOption(idx);
                        }
                    }
                }
                GUILayout.EndScrollView();
            }
            GUILayout.EndArea();

            GUIUtil.PopSkin();
        }
Esempio n. 4
0
        public static void BeforeClass()
        {
            //設定ファイルの退避と上書き
            _op = new TmpOption("WebServerTest", "WebServerTest.ini");
            var _kernel = new Kernel();

            option = _kernel.ListOption.Get("Web-localhost:88");
        }
Esempio n. 5
0
        // public method

        public void SelectOption(int idx)
        {
            //AnimationState astate = CutsceneController.GetAnimState(m_Dialog.CC);

            //astate.speed = m_prevTimeScale;//resume the anim
            Time.timeScale = m_prevTimeScale;

            OneOption opt  = m_AllOptions.m_Options[idx];
            string    ttag = opt.m_TimeTag;

            CutsceneController.JumpToTimeTag(m_Dialog.CC, ttag);

            enabled = false;
        }
Esempio n. 6
0
        public MlOption(Kernel kernel, OneOption op)
        {
            var maxSummary       = (int)op.GetValue("maxSummary");
            var maxGet           = (int)op.GetValue("maxGet");
            var autoRegistration = (bool)op.GetValue("autoRegistration");//自動登録
            var titleKind        = (int)op.GetValue("title");
            var docs             = new List <string>();

            foreach (MlDocKind docKind in Enum.GetValues(typeof(MlDocKind)))
            {
                var buf = (string)op.GetValue(docKind.ToString().ToLower() + "Document");
                if (buf.Length < 2 || buf[buf.Length - 2] != '\r' || buf[buf.Length - 1] != '\n')
                {
                    buf = buf + "\r\n";
                }
                docs.Add(buf);
            }
            var manageDir = (string)op.GetValue("manageDir");

            //Ver6.0.1
            manageDir = kernel.ReplaceOptionEnv(manageDir);
            //Ver6.0.0で間違えたフォルダの修復
            if (Directory.Exists("%ExecutablePath%") && Directory.Exists("%ExecutablePath%\\ml"))
            {
                try{
                    var path = Path.GetFullPath("%ExecutablePath%");
                    var dir  = Path.GetDirectoryName(path);
                    if (dir != null)
                    {
                        Directory.Move(path + "\\ml", dir + "\\ml");
                        Directory.Delete(path);
                    }
                } catch (Exception) {
                    ;
                }
            }


            var memberList = (Dat)op.GetValue("memberList");

            if (memberList == null)
            {
                memberList = new Dat(new[] { CtrlType.TextBox, CtrlType.TextBox, CtrlType.CheckBox, CtrlType.CheckBox, CtrlType.CheckBox, CtrlType.TextBox });
            }


            Init(maxSummary, maxGet, autoRegistration, titleKind, docs, manageDir, memberList);
        }
Esempio n. 7
0
        public static void BeforeClass()
        {
            //設定ファイルの退避と上書き
            _op = new TmpOption("WebServerTest", "WebServerTest.ini");
            Kernel kernel = new Kernel();

            option = kernel.ListOption.Get("Web-localhost:88");


            //サーバ起動
            _v4Sv = new Server(kernel, new Conf(option), new OneBind(new Ip(IpKind.V4Localhost), ProtocolKind.Tcp));
            _v4Sv.Start();

            _v6Sv = new Server(kernel, new Conf(option), new OneBind(new Ip(IpKind.V6Localhost), ProtocolKind.Tcp));
            _v6Sv.Start();
        }
Esempio n. 8
0
        // 初期化
        private void Initialize(ListPlugin listPlugin)
        {
            Ar.Clear();

            //Java fix
            if (kernel.RunMode == RunMode.Remote)
            {
                return;
            }

            foreach (OneOption op in kernel.ListOption)
            {
                if (!op.UseServer)
                {
                    //サーバオプション以外は対象外にする
                    continue;
                }

                //プラグイン情報の検索
                OnePlugin onePlugin = listPlugin.Get(op.NameTag);
                //			if (onePlugin == null) {
                //				//設計上の問題
                //				Util.RuntimeException(string.Format("ListServer.initialize() listPlugin.get(%s)==null", op.getNameTag()));
                //			}

                if (op.NameTag.IndexOf("Web-") == 0)
                {
                    //既に同一ポートで仮想サーバがリストされている場合はサーバの生成は行わない
                    bool     find     = false;
                    int      port     = (int)op.GetValue("port");
                    BindAddr bindAddr = (BindAddr)op.GetValue("bindAddress2");
                    foreach (OneServer sv in Ar)
                    {
                        if (sv.NameTag.IndexOf("Web-") == 0)
                        {
                            OneOption o = kernel.ListOption.Get(sv.NameTag);
                            if (o != null)
                            {
                                //同一ポートの設定が既にリストされているかどうか
                                if (port == (int)o.GetValue("port"))
                                {
                                    // バインドアドレスが競合しているかどうか
                                    if (bindAddr.CheckCompetition((BindAddr)o.GetValue("bindAddress2")))
                                    {
                                        find = true;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    if (!find)
                    {
                        AddServer(new Conf(op), onePlugin); //サーバ(OneServer)生成
                    }
                }
                else
                {
                    AddServer(new Conf(op), onePlugin); //サーバ(OneServer)生成
                }
            }
        }
Esempio n. 9
0
        readonly uint _soaExpire; //終了時間(オプションで指定された有効時間)

        #endregion Fields

        #region Constructors

        //named.caで初期化する場合
        //public DnsCache(Logger logger, OneOption oneOption, string fileName) {
        public DnsCache(OneOption oneOption, string fileName)
        {
            uint ttl = 0;//rootCacheは有効期限なし

            //オプションを読み込んで、ローカルデータを初期化する
            //this.oneOption = oneOption;
            _soaExpire = (uint)(int)oneOption.GetValue("soaExpire");

            DomainName = ".";
            //this.defaultExpire = defaultExpire;
            if (File.Exists(fileName)) {
                using (var sr = new StreamReader(fileName, Encoding.GetEncoding("Shift_JIS"))) {
                    var tmpName = "";//全行のNAMEを保持する NAMEは前行と同じ場合省略が可能

                    while (true) {
                        var name = "";
                        //string Class = "IN";
                        var dnsType = DnsType.Unknown;

                        var str = sr.ReadLine();
                        if (str == null)
                            break;
                        //;以降はコメントとして削除する
                        var i = str.IndexOf(';');
                        if (i != -1)
                            str = str.Substring(0, i);

                        //空の行は処理しない
                        if (str.Length == 0)
                            continue;

                        //空白・タブを削除して、パラメータをtmp2へ取得する
                        var tmp = str.Split(new[] { ' ', '\t' });
                        var tmp2 = tmp.Where(s => s != "").ToList();

                        //************************************************
                        //タイプだけは省略することができないので、それを基準にサーチする
                        //************************************************
                        var typeCol = 0;
                        for (; typeCol < tmp2.Count; typeCol++) {
                            foreach (DnsType t in Enum.GetValues(typeof(DnsType))) {
                                if (tmp2[typeCol] != t.ToString().ToUpper()) continue;
                                dnsType = t;
                                break;
                            }
                            if (dnsType != DnsType.Unknown)
                                break;
                        }
                        if (dnsType == DnsType.Unknown)
                            goto err;//タイプが見つからない場合は、無効行とする

                        //タイプの次がDATAとなる
                        if (typeCol + 1 >= tmp2.Count)
                            goto err; //タイプの次にカラム(DATA)が存在しない
                        string dataStr = tmp2[typeCol + 1];

                        //************************************************
                        //クラス(IN)が含まれているかどうかをサーチする
                        //************************************************
                        var classCol = 0;
                        for (; classCol < tmp2.Count; classCol++){
                            if (tmp2[classCol] != "IN") continue;
                            goto find;
                        }
                        classCol = -1;
                    find:
                        //クラスが含まれた場合、そのカラムはclassColに保存されている
                        //含まれていない場合 classCol=-1

                        if (typeCol == 1) {
                            if (classCol == -1) { //INが無い場合
                                //0番目はNAME若しくはTTLとなる
                                if (str.Substring(0, 1) == " " || str.Substring(0, 1) == "\t") {
                                    //名前は省略されているので
                                    ttl = Convert.ToUInt32(tmp2[0]);
                                    ttl = Util.htonl(ttl);
                                } else {
                                    name = tmp2[0];
                                }
                            } else { //INが有る場合
                                if (classCol != 0)
                                    goto err;//位置がおかしい
                                //0番目はINであるので、名前もTTLも省略されている
                            }
                        } else if (typeCol == 2) {
                            if (classCol == -1) { //INが無い場合
                                //0番目はNAME、1番目はTTLとなる
                                name = tmp2[0];
                                ttl = Convert.ToUInt32(tmp2[1]);
                                ttl = Util.htonl(ttl);
                            } else { //INが有る場合
                                if (classCol != 1)
                                    goto err;//位置がおかしい

                                //0番目はNAME若しくはTTLとなる
                                if (str.Substring(0, 1) == " " || str.Substring(0, 1) == "\t") {
                                    //名前は省略されているので
                                    ttl = Convert.ToUInt32(tmp2[0]);
                                    ttl = Util.htonl(ttl);
                                } else {
                                    name = tmp2[0];
                                }
                            }
                        } else if (typeCol == 3) {
                            if (classCol == -1) { //INが無い場合
                                //カラム不足
                                goto err;
                            }
                            //INが有る場合
                            if (classCol != 2)
                                goto err;//位置がおかしい
                            //0番目はNAME、1番目はTTLとなる
                            name = tmp2[0];
                            ttl = Convert.ToUInt32(tmp2[1]);
                            ttl = Util.htonl(ttl);
                        }

                        //*********************************************
                        //nameの補完
                        //*********************************************
                        if (name == "@") { //@の場合
                            name = DomainName;
                        } else if (name.LastIndexOf('.') != name.Length - 1) { //最後に.がついていない場合、ドメイン名を追加する
                            name = name + "." + DomainName + ".";
                        } else if (name == "") {
                            name = tmpName;//前行と同じ
                        }
                        tmpName = name;//前行分として記憶する

                        //*********************************************
                        //string sataStr を変換してデータベースに追加
                        //*********************************************
                        if (dnsType == DnsType.A) {
                            var ipV4 = new Ip(dataStr);
                            Add(new OneRR(name, dnsType, ttl, ipV4.NetBytes()));
                        } else if (dnsType == DnsType.Ns) {
                            Add(new OneRR(name, dnsType, ttl, DnsUtil.Str2DnsName(dataStr)));
                        } else if (dnsType == DnsType.Aaaa) {
                            var ipV6 = new Ip(dataStr);
                            Add(new OneRR(name, dnsType, ttl, ipV6.NetBytes()));
                        } else {
                            Msg.Show(MsgKind.Error, "name.caには、タイプA,AAAA及びNS以外は使用できません。");
                            goto err;
                        }
                        continue;
                    err://行に矛盾が有る
                        Msg.Show(MsgKind.Error, string.Format("ServerDnsCache() レコード読み込みエラー 矛盾があります。[ {0} {1} ]", fileName, str));
                    }
                    sr.Close();
                }
            }
            //locaohostレコードの追加
            {
                var ip = new Ip("127.0.0.1");
                Add(new OneRR("localhost.", DnsType.A, ttl, ip.NetBytes()));
                Add(new OneRR("1.0.0.127.in-addr.arpa.", DnsType.Ptr, ttl, DnsUtil.Str2DnsName("localhost")));

                ip = new Ip("::1");
                Add(new OneRR("localhost.", DnsType.Aaaa, ttl, ip.NetBytes()));
                Add(new OneRR("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA.", DnsType.Ptr, ttl, DnsUtil.Str2DnsName("localhost")));
            }
        }
Esempio n. 10
0
        //リソース定義(Dat)で初期化する場合
        public DnsCache(Logger logger, OneOption oneOption, Dat dat, string dName)
        {
            const uint ttl = 0; //有効期限なし
            var ns = "";//SOA追加時に使用するため、NSレコードを見つけたときにサーバ名を保存しておく

            //オプションを読み込んで、ローカルデータを初期化する
            //this.oneOption = oneOption;
            _soaExpire = (uint)(int)oneOption.GetValue("soaExpire");

            DomainName = dName;

            foreach (var o in dat) {
                if (o.Enable) {
                    var type = Convert.ToInt32(o.StrList[0]);
                    var name = o.StrList[1];
                    var alias = o.StrList[2];
                    var ip = new Ip(o.StrList[3]);
                    var n = Convert.ToInt32(o.StrList[4]);

                    var dnsType = DnsType.A;
                    if (type == 1) {
                        dnsType = DnsType.Ns;
                    } else if (type == 2) {
                        dnsType = DnsType.Mx;
                    } else if (type == 3) {
                        dnsType = DnsType.Cname;
                    } else if (type == 4) {
                        dnsType = DnsType.Aaaa;
                    }
                    var priority = (ushort)n;
                    //uint addr = ip.AddrV4;        //class Ip -> uint;

                    //最後に.がついていない場合、ドメイン名を追加する
                    if (name.LastIndexOf('.') != name.Length - 1) {
                        name = name + "." + DomainName;
                    }
                    if (alias.LastIndexOf('.') != alias.Length - 1) {
                        alias = alias + "." + DomainName;
                    }

                    //CNAME以外は、PTRレコードを自動的に生成する
                    if (dnsType != DnsType.Cname) {
                        //PTR名を作成 [例] 192.168.0.1 -> 1.0.168.192.in-addr.arpa;
                        if (ip.InetKind == InetKind.V4) { //IPv4
                            string ptrName = string.Format("{0}.{1}.{2}.{3}.in-addr.arpa.", ip.IpV4[3], ip.IpV4[2], ip.IpV4[1], ip.IpV4[0]);
                            Add(new OneRR(ptrName, DnsType.Ptr, ttl, DnsUtil.Str2DnsName(name)));
                        } else { //IPv6
                            var sb = new StringBuilder();
                            foreach (var a in ip.IpV6) {
                                sb.Append(string.Format("{0:x4}", a));
                            }
                            string ipStr = sb.ToString();
                            if (ipStr.Length == 32) {
                                sb = new StringBuilder();
                                for (int e = 31; e >= 0; e--) {
                                    sb.Append(ipStr[e]);
                                    sb.Append('.');
                                }
                                Add(new OneRR(sb + "ip6.arpa.", DnsType.Ptr, ttl, DnsUtil.Str2DnsName(name)));
                            }
                        }
                    }

                    //データベースへの追加
                    if (dnsType == DnsType.A) {
                        if (ip.InetKind == InetKind.V4) {
                            //ネットワークバイト配列の取得
                            Add(new OneRR(name, DnsType.A, ttl, ip.NetBytes()));
                        } else {
                            logger.Set(LogKind.Error, null, 19, string.Format("address {0}", ip));
                        }
                    } else if (dnsType == DnsType.Aaaa) {
                        if (ip.InetKind == InetKind.V6) {
                            Add(new OneRR(name, DnsType.Aaaa, ttl, ip.NetBytes()));
                        } else {
                            logger.Set(LogKind.Error, null, 20, string.Format("address {0}", ip));
                        }
                    } else if (dnsType == DnsType.Ns) {
                        ns = name;//SOA追加時に使用するため、ネームサーバの名前を保存する

                        // A or AAAAレコードも追加
                        Add(new OneRR(name, (ip.InetKind == InetKind.V4) ? DnsType.A : DnsType.Aaaa, ttl, ip.NetBytes()));

                        Add(new OneRR(DomainName, DnsType.Ns, ttl, DnsUtil.Str2DnsName(name)));
                    } else if (dnsType == DnsType.Mx) {
                        // A or AAAAレコードも追加
                        Add(new OneRR(name, DnsType.A, ttl, ip.NetBytes()));

                        //プライオリィ
                        byte[] dataName = DnsUtil.Str2DnsName(name);//DNS名前形式に変換
                        byte[] data = Bytes.Create(Util.htons(priority), dataName);
                        Add(new OneRR(DomainName, DnsType.Mx, ttl, data));
                    } else if (dnsType == DnsType.Cname) {
                        Add(new OneRR(alias, DnsType.Cname, ttl, DnsUtil.Str2DnsName(name)));
                    }
                }

                //SOAレコードの追加
                if (ns != "") { //NSサーバ名が必須
                    var soaMail = (string)oneOption.GetValue("soaMail");
                    soaMail.Replace('@', '.');//@を.に置き換える
                    soaMail = soaMail + ".";//最後に.を追加する
                    var soaSerial = (uint)(int)oneOption.GetValue("soaSerial");
                    var soaRefresh = (uint)(int)oneOption.GetValue("soaRefresh");
                    var soaRetry = (uint)(int)oneOption.GetValue("soaRetry");
                    var soaExpire = (uint)(int)oneOption.GetValue("soaExpire");
                    var soaMinimum = (uint)(int)oneOption.GetValue("soaMinimum");

                    byte[] data = Bytes.Create(
                        DnsUtil.Str2DnsName(ns),
                        DnsUtil.Str2DnsName(soaMail),
                        Util.htonl(soaSerial),
                        Util.htonl(soaRefresh),
                        Util.htonl(soaRetry),
                        Util.htonl(soaExpire),
                        Util.htonl(soaMinimum));

                    Add(new OneRR(DomainName, DnsType.Soa, ttl, data));
                }
            }
        }
Esempio n. 11
0
        //リソース定義(Dat)で初期化する場合
        public DnsCache(Logger logger, OneOption oneOption, Dat dat, string dName)
        {
            const uint ttl = 0;  //有効期限なし
            var        ns  = ""; //SOA追加時に使用するため、NSレコードを見つけたときにサーバ名を保存しておく

            //オプションを読み込んで、ローカルデータを初期化する
            //this.oneOption = oneOption;
            _soaExpire = (uint)(int)oneOption.GetValue("soaExpire");

            DomainName = dName;

            foreach (var o in dat)
            {
                if (o.Enable)
                {
                    var type  = Convert.ToInt32(o.StrList[0]);
                    var name  = o.StrList[1];
                    var alias = o.StrList[2];
                    var ip    = new Ip(o.StrList[3]);
                    var n     = Convert.ToInt32(o.StrList[4]);

                    var dnsType = DnsType.A;
                    if (type == 1)
                    {
                        dnsType = DnsType.Ns;
                    }
                    else if (type == 2)
                    {
                        dnsType = DnsType.Mx;
                    }
                    else if (type == 3)
                    {
                        dnsType = DnsType.Cname;
                    }
                    else if (type == 4)
                    {
                        dnsType = DnsType.Aaaa;
                    }
                    var priority = (ushort)n;
                    //uint addr = ip.AddrV4;        //class Ip -> uint;

                    //最後に.がついていない場合、ドメイン名を追加する
                    if (name.LastIndexOf('.') != name.Length - 1)
                    {
                        name = name + "." + DomainName;
                    }
                    if (alias.LastIndexOf('.') != alias.Length - 1)
                    {
                        alias = alias + "." + DomainName;
                    }

                    //CNAME以外は、PTRレコードを自動的に生成する
                    if (dnsType != DnsType.Cname)
                    {
                        //PTR名を作成 [例] 192.168.0.1 -> 1.0.168.192.in-addr.arpa;
                        if (ip.InetKind == InetKind.V4)   //IPv4
                        {
                            string ptrName = string.Format("{0}.{1}.{2}.{3}.in-addr.arpa.", ip.IpV4[3], ip.IpV4[2], ip.IpV4[1], ip.IpV4[0]);
                            Add(new OneRR(ptrName, DnsType.Ptr, ttl, DnsUtil.Str2DnsName(name)));
                        }
                        else     //IPv6
                        {
                            var sb = new StringBuilder();
                            foreach (var a in ip.IpV6)
                            {
                                sb.Append(string.Format("{0:x4}", a));
                            }
                            string ipStr = sb.ToString();
                            if (ipStr.Length == 32)
                            {
                                sb = new StringBuilder();
                                for (int e = 31; e >= 0; e--)
                                {
                                    sb.Append(ipStr[e]);
                                    sb.Append('.');
                                }
                                Add(new OneRR(sb + "ip6.arpa.", DnsType.Ptr, ttl, DnsUtil.Str2DnsName(name)));
                            }
                        }
                    }

                    //データベースへの追加
                    if (dnsType == DnsType.A)
                    {
                        if (ip.InetKind == InetKind.V4)
                        {
                            //ネットワークバイト配列の取得
                            Add(new OneRR(name, DnsType.A, ttl, ip.NetBytes()));
                        }
                        else
                        {
                            logger.Set(LogKind.Error, null, 19, string.Format("address {0}", ip));
                        }
                    }
                    else if (dnsType == DnsType.Aaaa)
                    {
                        if (ip.InetKind == InetKind.V6)
                        {
                            Add(new OneRR(name, DnsType.Aaaa, ttl, ip.NetBytes()));
                        }
                        else
                        {
                            logger.Set(LogKind.Error, null, 20, string.Format("address {0}", ip));
                        }
                    }
                    else if (dnsType == DnsType.Ns)
                    {
                        ns = name;//SOA追加時に使用するため、ネームサーバの名前を保存する

                        // A or AAAAレコードも追加
                        Add(new OneRR(name, (ip.InetKind == InetKind.V4) ? DnsType.A : DnsType.Aaaa, ttl, ip.NetBytes()));

                        Add(new OneRR(DomainName, DnsType.Ns, ttl, DnsUtil.Str2DnsName(name)));
                    }
                    else if (dnsType == DnsType.Mx)
                    {
                        // A or AAAAレコードも追加
                        Add(new OneRR(name, DnsType.A, ttl, ip.NetBytes()));

                        //プライオリィ
                        byte[] dataName = DnsUtil.Str2DnsName(name);//DNS名前形式に変換
                        byte[] data     = Bytes.Create(Util.htons(priority), dataName);
                        Add(new OneRR(DomainName, DnsType.Mx, ttl, data));
                    }
                    else if (dnsType == DnsType.Cname)
                    {
                        Add(new OneRR(alias, DnsType.Cname, ttl, DnsUtil.Str2DnsName(name)));
                    }
                }

                //SOAレコードの追加
                if (ns != "")   //NSサーバ名が必須
                {
                    var soaMail = (string)oneOption.GetValue("soaMail");
                    soaMail.Replace('@', '.'); //@を.に置き換える
                    soaMail = soaMail + ".";   //最後に.を追加する
                    var soaSerial  = (uint)(int)oneOption.GetValue("soaSerial");
                    var soaRefresh = (uint)(int)oneOption.GetValue("soaRefresh");
                    var soaRetry   = (uint)(int)oneOption.GetValue("soaRetry");
                    var soaExpire  = (uint)(int)oneOption.GetValue("soaExpire");
                    var soaMinimum = (uint)(int)oneOption.GetValue("soaMinimum");

                    byte[] data = Bytes.Create(
                        DnsUtil.Str2DnsName(ns),
                        DnsUtil.Str2DnsName(soaMail),
                        Util.htonl(soaSerial),
                        Util.htonl(soaRefresh),
                        Util.htonl(soaRetry),
                        Util.htonl(soaExpire),
                        Util.htonl(soaMinimum));

                    Add(new OneRR(DomainName, DnsType.Soa, ttl, data));
                }
            }
        }
Esempio n. 12
0
        readonly uint _soaExpire;//終了時間(オプションで指定された有効時間)

        //named.caで初期化する場合
        //public DnsCache(Logger logger, OneOption oneOption, string fileName) {
        public DnsCache(OneOption oneOption, string fileName)
        {
            uint ttl = 0;//rootCacheは有効期限なし

            //オプションを読み込んで、ローカルデータを初期化する
            //this.oneOption = oneOption;
            _soaExpire = (uint)(int)oneOption.GetValue("soaExpire");

            DomainName = ".";
            //this.defaultExpire = defaultExpire;
            if (File.Exists(fileName))
            {
                using (var sr = new StreamReader(fileName, Encoding.GetEncoding("Shift_JIS"))) {
                    var tmpName = "";//全行のNAMEを保持する NAMEは前行と同じ場合省略が可能

                    while (true)
                    {
                        var name = "";
                        //string Class = "IN";
                        var dnsType = DnsType.Unknown;

                        var str = sr.ReadLine();
                        if (str == null)
                        {
                            break;
                        }
                        //;以降はコメントとして削除する
                        var i = str.IndexOf(';');
                        if (i != -1)
                        {
                            str = str.Substring(0, i);
                        }

                        //空の行は処理しない
                        if (str.Length == 0)
                        {
                            continue;
                        }

                        //空白・タブを削除して、パラメータをtmp2へ取得する
                        var tmp  = str.Split(new[] { ' ', '\t' });
                        var tmp2 = tmp.Where(s => s != "").ToList();

                        //************************************************
                        //タイプだけは省略することができないので、それを基準にサーチする
                        //************************************************
                        var typeCol = 0;
                        for (; typeCol < tmp2.Count; typeCol++)
                        {
                            foreach (DnsType t in Enum.GetValues(typeof(DnsType)))
                            {
                                if (tmp2[typeCol] != t.ToString().ToUpper())
                                {
                                    continue;
                                }
                                dnsType = t;
                                break;
                            }
                            if (dnsType != DnsType.Unknown)
                            {
                                break;
                            }
                        }
                        if (dnsType == DnsType.Unknown)
                        {
                            goto err;//タイプが見つからない場合は、無効行とする
                        }
                        //タイプの次がDATAとなる
                        if (typeCol + 1 >= tmp2.Count)
                        {
                            goto err; //タイプの次にカラム(DATA)が存在しない
                        }
                        string dataStr = tmp2[typeCol + 1];

                        //************************************************
                        //クラス(IN)が含まれているかどうかをサーチする
                        //************************************************
                        var classCol = 0;
                        for (; classCol < tmp2.Count; classCol++)
                        {
                            if (tmp2[classCol] != "IN")
                            {
                                continue;
                            }
                            goto find;
                        }
                        classCol = -1;
find:
                        //クラスが含まれた場合、そのカラムはclassColに保存されている
                        //含まれていない場合 classCol=-1

                        if (typeCol == 1)
                        {
                            if (classCol == -1)   //INが無い場合
                            //0番目はNAME若しくはTTLとなる
                            {
                                if (str.Substring(0, 1) == " " || str.Substring(0, 1) == "\t")
                                {
                                    //名前は省略されているので
                                    ttl = Convert.ToUInt32(tmp2[0]);
                                    ttl = Util.htonl(ttl);
                                }
                                else
                                {
                                    name = tmp2[0];
                                }
                            }
                            else     //INが有る場合
                            {
                                if (classCol != 0)
                                {
                                    goto err;//位置がおかしい
                                }
                                //0番目はINであるので、名前もTTLも省略されている
                            }
                        }
                        else if (typeCol == 2)
                        {
                            if (classCol == -1)   //INが無い場合
                            //0番目はNAME、1番目はTTLとなる
                            {
                                name = tmp2[0];
                                ttl  = Convert.ToUInt32(tmp2[1]);
                                ttl  = Util.htonl(ttl);
                            }
                            else     //INが有る場合
                            {
                                if (classCol != 1)
                                {
                                    goto err;//位置がおかしい
                                }
                                //0番目はNAME若しくはTTLとなる
                                if (str.Substring(0, 1) == " " || str.Substring(0, 1) == "\t")
                                {
                                    //名前は省略されているので
                                    ttl = Convert.ToUInt32(tmp2[0]);
                                    ttl = Util.htonl(ttl);
                                }
                                else
                                {
                                    name = tmp2[0];
                                }
                            }
                        }
                        else if (typeCol == 3)
                        {
                            if (classCol == -1)   //INが無い場合
                            //カラム不足
                            {
                                goto err;
                            }
                            //INが有る場合
                            if (classCol != 2)
                            {
                                goto err;//位置がおかしい
                            }
                            //0番目はNAME、1番目はTTLとなる
                            name = tmp2[0];
                            ttl  = Convert.ToUInt32(tmp2[1]);
                            ttl  = Util.htonl(ttl);
                        }

                        //*********************************************
                        //nameの補完
                        //*********************************************
                        if (name == "@")   //@の場合
                        {
                            name = DomainName;
                        }
                        else if (name.LastIndexOf('.') != name.Length - 1)     //最後に.がついていない場合、ドメイン名を追加する
                        {
                            name = name + "." + DomainName + ".";
                        }
                        else if (name == "")
                        {
                            name = tmpName; //前行と同じ
                        }
                        tmpName = name;     //前行分として記憶する

                        //*********************************************
                        //string sataStr を変換してデータベースに追加
                        //*********************************************
                        if (dnsType == DnsType.A)
                        {
                            var ipV4 = new Ip(dataStr);
                            Add(new OneRR(name, dnsType, ttl, ipV4.NetBytes()));
                        }
                        else if (dnsType == DnsType.Ns)
                        {
                            Add(new OneRR(name, dnsType, ttl, DnsUtil.Str2DnsName(dataStr)));
                        }
                        else if (dnsType == DnsType.Aaaa)
                        {
                            var ipV6 = new Ip(dataStr);
                            Add(new OneRR(name, dnsType, ttl, ipV6.NetBytes()));
                        }
                        else
                        {
                            Msg.Show(MsgKind.Error, "name.caには、タイプA,AAAA及びNS以外は使用できません。");
                            goto err;
                        }
                        continue;
err:                    //行に矛盾が有る
                        Msg.Show(MsgKind.Error, string.Format("ServerDnsCache() レコード読み込みエラー 矛盾があります。[ {0} {1} ]", fileName, str));
                    }
                    sr.Close();
                }
            }
            //locaohostレコードの追加
            {
                var ip = new Ip("127.0.0.1");
                Add(new OneRR("localhost.", DnsType.A, ttl, ip.NetBytes()));
                Add(new OneRR("1.0.0.127.in-addr.arpa.", DnsType.Ptr, ttl, DnsUtil.Str2DnsName("localhost")));

                ip = new Ip("::1");
                Add(new OneRR("localhost.", DnsType.Aaaa, ttl, ip.NetBytes()));
                Add(new OneRR("1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA.", DnsType.Ptr, ttl, DnsUtil.Str2DnsName("localhost")));
            }
        }