diff --git a/Apps/GeoDistanceApp/Address.cs b/Apps/GeoDistanceApp/Address.cs
index 8425ab8e..b24b0d1c 100644
--- a/Apps/GeoDistanceApp/Address.cs
+++ b/Apps/GeoDistanceApp/Address.cs
@@ -18,13 +18,11 @@ along with this program. If not, see .
*/
using DnsApplicationCommon;
-using MaxMind.GeoIP2;
using MaxMind.GeoIP2.Model;
using MaxMind.GeoIP2.Responses;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
-using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
@@ -38,7 +36,7 @@ namespace GeoDistance
{
#region variables
- DatabaseReader _mmCityReader;
+ MaxMind _maxMind;
#endregion
@@ -53,8 +51,8 @@ namespace GeoDistance
if (disposing)
{
- if (_mmCityReader != null)
- _mmCityReader.Dispose();
+ if (_maxMind is not null)
+ _maxMind.Dispose();
}
_disposed = true;
@@ -86,18 +84,7 @@ namespace GeoDistance
public Task InitializeAsync(IDnsServer dnsServer, string config)
{
- if (_mmCityReader == null)
- {
- string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-City.mmdb");
-
- if (!File.Exists(mmFile))
- mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-City.mmdb");
-
- if (!File.Exists(mmFile))
- throw new FileNotFoundException("MaxMind City file is missing!");
-
- _mmCityReader = new DatabaseReader(mmFile);
- }
+ _maxMind = MaxMind.Create(dnsServer);
return Task.CompletedTask;
}
@@ -111,7 +98,7 @@ namespace GeoDistance
case DnsResourceRecordType.AAAA:
Location location = null;
- if (_mmCityReader.TryCity(remoteEP.Address, out CityResponse response))
+ if (_maxMind.DatabaseReader.TryCity(remoteEP.Address, out CityResponse response))
location = response.Location;
dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData);
diff --git a/Apps/GeoDistanceApp/CNAME.cs b/Apps/GeoDistanceApp/CNAME.cs
index 778a8952..dd55c0fa 100644
--- a/Apps/GeoDistanceApp/CNAME.cs
+++ b/Apps/GeoDistanceApp/CNAME.cs
@@ -18,13 +18,11 @@ along with this program. If not, see .
*/
using DnsApplicationCommon;
-using MaxMind.GeoIP2;
using MaxMind.GeoIP2.Model;
using MaxMind.GeoIP2.Responses;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
-using System.IO;
using System.Net;
using System.Threading.Tasks;
using TechnitiumLibrary.Net.Dns;
@@ -36,7 +34,7 @@ namespace GeoDistance
{
#region variables
- DatabaseReader _mmCityReader;
+ MaxMind _maxMind;
#endregion
@@ -51,8 +49,8 @@ namespace GeoDistance
if (disposing)
{
- if (_mmCityReader != null)
- _mmCityReader.Dispose();
+ if (_maxMind is not null)
+ _maxMind.Dispose();
}
_disposed = true;
@@ -84,18 +82,7 @@ namespace GeoDistance
public Task InitializeAsync(IDnsServer dnsServer, string config)
{
- if (_mmCityReader == null)
- {
- string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-City.mmdb");
-
- if (!File.Exists(mmFile))
- mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-City.mmdb");
-
- if (!File.Exists(mmFile))
- throw new FileNotFoundException("MaxMind City file is missing!");
-
- _mmCityReader = new DatabaseReader(mmFile);
- }
+ _maxMind = MaxMind.Create(dnsServer);
return Task.CompletedTask;
}
@@ -104,7 +91,7 @@ namespace GeoDistance
{
Location location = null;
- if (_mmCityReader.TryCity(remoteEP.Address, out CityResponse response))
+ if (_maxMind.DatabaseReader.TryCity(remoteEP.Address, out CityResponse response))
location = response.Location;
dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData);
diff --git a/Apps/GeoDistanceApp/MaxMind.cs b/Apps/GeoDistanceApp/MaxMind.cs
new file mode 100644
index 00000000..fb86a45d
--- /dev/null
+++ b/Apps/GeoDistanceApp/MaxMind.cs
@@ -0,0 +1,99 @@
+/*
+Technitium DNS Server
+Copyright (C) 2021 Shreyas Zare (shreyas@technitium.com)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+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
+along with this program. If not, see .
+
+*/
+
+using DnsApplicationCommon;
+using MaxMind.GeoIP2;
+using System;
+using System.IO;
+
+namespace GeoDistance
+{
+ class MaxMind : IDisposable
+ {
+ #region variables
+
+ static MaxMind _maxMind;
+
+ readonly DatabaseReader _mmCityReader;
+
+ #endregion
+
+ #region constructor
+
+ private MaxMind(IDnsServer dnsServer)
+ {
+ string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-City.mmdb");
+
+ if (!File.Exists(mmFile))
+ mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-City.mmdb");
+
+ if (!File.Exists(mmFile))
+ throw new FileNotFoundException("MaxMind City file is missing!");
+
+ _mmCityReader = new DatabaseReader(mmFile);
+ }
+
+ #endregion
+
+ #region IDisposable
+
+ bool _disposed;
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (_disposed)
+ return;
+
+ if (disposing)
+ {
+ if (_mmCityReader is not null)
+ _mmCityReader.Dispose();
+ }
+
+ _disposed = true;
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ #endregion
+
+ #region public
+
+ public static MaxMind Create(IDnsServer dnsServer)
+ {
+ if (_maxMind is null)
+ _maxMind = new MaxMind(dnsServer);
+
+ return _maxMind;
+ }
+
+ #endregion
+
+ #region properties
+
+ public DatabaseReader DatabaseReader
+ { get { return _mmCityReader; } }
+
+ #endregion
+ }
+}