129 lines
3.8 KiB
C#
129 lines
3.8 KiB
C#
using BestHTTP.PlatformSupport.FileSystem;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace BestHTTP.Core
|
|
{
|
|
internal static class HostManager
|
|
{
|
|
private const int Version = 1;
|
|
private static string LibraryPath = string.Empty;
|
|
private static bool IsSaveAndLoadSupported = false;
|
|
private static bool IsLoaded = false;
|
|
|
|
private static Dictionary<string, HostDefinition> hosts = new Dictionary<string, HostDefinition>();
|
|
|
|
public static HostDefinition GetHost(string hostStr)
|
|
{
|
|
HostDefinition host;
|
|
if (!hosts.TryGetValue(hostStr, out host))
|
|
hosts.Add(hostStr, host = new HostDefinition(hostStr));
|
|
|
|
return host;
|
|
}
|
|
|
|
public static void TryToSendQueuedRequests()
|
|
{
|
|
foreach (var kvp in hosts)
|
|
kvp.Value.TryToSendQueuedRequests();
|
|
}
|
|
|
|
public static void Shutdown()
|
|
{
|
|
HTTPManager.Logger.Information("HostManager", "Shutdown initiated!");
|
|
foreach (var kvp in hosts)
|
|
kvp.Value.Shutdown();
|
|
}
|
|
|
|
public static void Clear()
|
|
{
|
|
HTTPManager.Logger.Information("HostManager", "Clearing hosts!");
|
|
hosts.Clear();
|
|
}
|
|
|
|
private static void SetupFolder()
|
|
{
|
|
if (string.IsNullOrEmpty(LibraryPath))
|
|
{
|
|
try
|
|
{
|
|
LibraryPath = System.IO.Path.Combine(HTTPManager.GetRootCacheFolder(), "Hosts");
|
|
HTTPManager.IOService.FileExists(LibraryPath);
|
|
IsSaveAndLoadSupported = true;
|
|
}
|
|
catch
|
|
{
|
|
IsSaveAndLoadSupported = false;
|
|
HTTPManager.Logger.Warning("HostManager", "Save and load Disabled!");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void Save()
|
|
{
|
|
if (!IsSaveAndLoadSupported || string.IsNullOrEmpty(LibraryPath))
|
|
return;
|
|
|
|
try
|
|
{
|
|
using (var fs = HTTPManager.IOService.CreateFileStream(LibraryPath, FileStreamModes.Create))
|
|
using (var bw = new System.IO.BinaryWriter(fs))
|
|
{
|
|
bw.Write(Version);
|
|
|
|
bw.Write(hosts.Count);
|
|
foreach (var kvp in hosts)
|
|
{
|
|
bw.Write(kvp.Key.ToString());
|
|
|
|
kvp.Value.SaveTo(bw);
|
|
}
|
|
}
|
|
HTTPManager.Logger.Information("HostManager", hosts.Count + " hosts saved!");
|
|
}
|
|
catch
|
|
{ }
|
|
}
|
|
|
|
public static void Load()
|
|
{
|
|
if (IsLoaded)
|
|
return;
|
|
IsLoaded = true;
|
|
|
|
SetupFolder();
|
|
|
|
if (!IsSaveAndLoadSupported || string.IsNullOrEmpty(LibraryPath) || !HTTPManager.IOService.FileExists(LibraryPath))
|
|
return;
|
|
|
|
try
|
|
{
|
|
using (var fs = HTTPManager.IOService.CreateFileStream(LibraryPath, FileStreamModes.Open))
|
|
using (var br = new System.IO.BinaryReader(fs))
|
|
{
|
|
int version = br.ReadInt32();
|
|
|
|
int hostCount = br.ReadInt32();
|
|
|
|
for (int i = 0; i < hostCount; ++i)
|
|
{
|
|
GetHost(br.ReadString())
|
|
.LoadFrom(version, br);
|
|
}
|
|
|
|
HTTPManager.Logger.Information("HostManager", hostCount.ToString() + " HostDefinitions loaded!");
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
try
|
|
{
|
|
HTTPManager.IOService.FileDelete(LibraryPath);
|
|
}
|
|
catch
|
|
{ }
|
|
}
|
|
}
|
|
}
|
|
}
|