diff --git a/DnsServerCore/Dns/Applications/DnsApplicationManager.cs b/DnsServerCore/Dns/Applications/DnsApplicationManager.cs
index 9a41409c..1d8b784c 100644
--- a/DnsServerCore/Dns/Applications/DnsApplicationManager.cs
+++ b/DnsServerCore/Dns/Applications/DnsApplicationManager.cs
@@ -17,6 +17,7 @@ along with this program. If not, see .
*/
+using DnsApplicationCommon;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -37,6 +38,10 @@ namespace DnsServerCore.Dns.Applications
readonly ConcurrentDictionary _applications = new ConcurrentDictionary();
+ IReadOnlyList _dnsRequestControllers = Array.Empty();
+ IReadOnlyList _dnsAuthoritativeRequestHandlers = Array.Empty();
+ IReadOnlyList _dnsLoggers = Array.Empty();
+
#endregion
#region constructor
@@ -80,7 +85,7 @@ namespace DnsServerCore.Dns.Applications
#region private
- private async Task LoadApplicationAsync(string applicationFolder)
+ private async Task LoadApplicationAsync(string applicationFolder, bool refreshAppObjectList)
{
string appName = Path.GetFileName(applicationFolder);
@@ -92,6 +97,9 @@ namespace DnsServerCore.Dns.Applications
if (!_applications.TryAdd(application.AppName, application))
throw new DnsServerException("DNS application already exists: " + application.AppName);
+
+ if (refreshAppObjectList)
+ RefreshAppObjectLists();
}
catch
{
@@ -100,14 +108,38 @@ namespace DnsServerCore.Dns.Applications
}
}
- public void UnloadApplication(string appName)
+ private void UnloadApplication(string appName)
{
if (!_applications.TryRemove(appName, out DnsApplication existingApp))
throw new DnsServerException("DNS application does not exists: " + appName);
+ RefreshAppObjectLists();
+
existingApp.Dispose();
}
+ private void RefreshAppObjectLists()
+ {
+ List dnsRequestControllers = new List(1);
+ List dnsAuthoritativeRequestHandlers = new List(1);
+ List dnsLoggers = new List(1);
+
+ foreach (KeyValuePair application in _applications)
+ {
+ foreach (KeyValuePair controller in application.Value.DnsRequestControllers)
+ dnsRequestControllers.Add(controller.Value);
+
+ foreach (KeyValuePair handler in application.Value.DnsAuthoritativeRequestHandlers)
+ dnsAuthoritativeRequestHandlers.Add(handler.Value);
+
+ foreach (KeyValuePair logger in application.Value.DnsLoggers)
+ dnsLoggers.Add(logger.Value);
+ }
+
+ _dnsRequestControllers = dnsRequestControllers;
+ _dnsAuthoritativeRequestHandlers = dnsAuthoritativeRequestHandlers;
+ _dnsLoggers = dnsLoggers;
+ }
#endregion
@@ -130,6 +162,9 @@ namespace DnsServerCore.Dns.Applications
}
_applications.Clear();
+ _dnsRequestControllers = Array.Empty();
+ _dnsAuthoritativeRequestHandlers = Array.Empty();
+ _dnsLoggers = Array.Empty();
}
public void LoadAllApplications()
@@ -142,7 +177,8 @@ namespace DnsServerCore.Dns.Applications
{
try
{
- await LoadApplicationAsync(applicationFolder);
+ await LoadApplicationAsync(applicationFolder, false);
+ RefreshAppObjectLists();
LogManager log = _dnsServer.LogManager;
if (log != null)
@@ -174,7 +210,7 @@ namespace DnsServerCore.Dns.Applications
{
appZip.ExtractToDirectory(applicationFolder, true);
- await LoadApplicationAsync(applicationFolder);
+ await LoadApplicationAsync(applicationFolder, true);
}
catch
{
@@ -214,14 +250,18 @@ namespace DnsServerCore.Dns.Applications
entry.ExtractToFile(filePath, true);
}
- await LoadApplicationAsync(applicationFolder);
+ await LoadApplicationAsync(applicationFolder, true);
}
}
public void UninstallApplication(string appName)
{
if (_applications.TryRemove(appName, out DnsApplication app))
+ {
+ RefreshAppObjectLists();
+
app.Dispose();
+ }
if (Directory.Exists(app.DnsServer.ApplicationFolder))
Directory.Delete(app.DnsServer.ApplicationFolder, true);
@@ -234,6 +274,15 @@ namespace DnsServerCore.Dns.Applications
public IReadOnlyDictionary Applications
{ get { return _applications; } }
+ public IReadOnlyList DnsRequestControllers
+ { get { return _dnsRequestControllers; } }
+
+ public IReadOnlyList DnsAuthoritativeRequestHandlers
+ { get { return _dnsAuthoritativeRequestHandlers; } }
+
+ public IReadOnlyList DnsLoggers
+ { get { return _dnsLoggers; } }
+
#endregion
}
}