mattercontrol/SettingsManagement/ApplicationSettings.cs
2017-05-22 17:52:08 -07:00

245 lines
No EOL
5.9 KiB
C#

using MatterHackers.MatterControl.DataStorage;
using MatterHackers.MatterControl.SettingsManagement;
using System.Collections.Generic;
using System;
using Newtonsoft.Json;
using System.Linq;
using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl
{
public static class ApplicationSettingsKey
{
public const string SuppressAuthPanel = nameof(SuppressAuthPanel);
public const string HardwareHasCamera = nameof(HardwareHasCamera);
public const string HideGCodeWarning = nameof(HideGCodeWarning);
public const string DesktopPosition = nameof(DesktopPosition);
public const string WindowSize = nameof(WindowSize);
public const string MainWindowMaximized = nameof(MainWindowMaximized);
}
public class ApplicationSettings
{
public static string LibraryFilterFileExtensions { get; } = ".stl,.amf,.gcode,.mcx";
public static string OpenPrintableFileParams { get; } = "STL, AMF, OBJ, ZIP, GCODE, MCX|*.stl;*.amf;*.obj;*.zip;*.gcode;*.mcx";
public static string OpenDesignFileParams { get; } = "STL, AMF, OBJ, ZIP, GCODE, MCX|*.stl;*.amf;*.obj;*.zip;*.gcode;*.mcx";
private static ApplicationSettings globalInstance = null;
public Dictionary<string, SystemSetting> settingsDictionary;
public static ApplicationSettings Instance
{
get
{
if (globalInstance == null)
{
globalInstance = new ApplicationSettings();
globalInstance.LoadData();
}
return globalInstance;
}
}
private string oemName = null;
public string GetOEMName()
{
if (oemName == null)
{
string[] printerWhiteListStrings = OemSettings.Instance.PrinterWhiteList.ToArray();
if (printerWhiteListStrings.Length == 0
|| printerWhiteListStrings.Length > 1)
{
oemName = "MatterHackers";
}
else
{
oemName = printerWhiteListStrings[0];
}
}
return oemName;
}
private string runningTokensKeyName = $"{ApplicationController.EnvironmentName}ClientToken_RunningTokens";
private string claimedClientToken = null;
public string GetClientToken()
{
if (!string.IsNullOrEmpty(claimedClientToken))
{
return claimedClientToken;
}
// This code should only run once per application and get cached in a local property (claimedClientToken)
List<string> allocatedClientTokens = GetAllocatedClientTokens();
HashSet<string> runningClientTokens = GetRunningClientTokens();
if (ApplicationController.ApplicationInstanceCount == 1
&& !string.IsNullOrEmpty(AuthenticationData.Instance.ActiveClientToken))
{
claimedClientToken = AuthenticationData.Instance.ActiveClientToken;
}
else
{
var availableTokens = allocatedClientTokens.Except(runningClientTokens);
claimedClientToken = availableTokens.FirstOrDefault();
}
// Claim ClientToken
if (!string.IsNullOrEmpty(claimedClientToken))
{
runningClientTokens.Add(claimedClientToken);
}
SetRunningClientTokens(runningClientTokens);
return claimedClientToken;
}
public void ReleaseClientToken()
{
// Release ClientToken
HashSet<string> runningClientTokens = GetRunningClientTokens();
runningClientTokens.Remove(claimedClientToken);
SetRunningClientTokens(runningClientTokens);
}
private List<string> GetAllocatedClientTokens()
{
List<string> allocatedClientTokens = new List<string>();
string clientToken;
int allocatedCount = 0;
do
{
string keyName = $"{ApplicationController.EnvironmentName}ClientToken";
if (allocatedCount > 0)
{
keyName += "_" + allocatedCount;
}
clientToken = get(keyName);
if (!string.IsNullOrEmpty(clientToken))
{
allocatedClientTokens.Add(clientToken);
}
allocatedCount++;
} while (!string.IsNullOrEmpty(clientToken));
return allocatedClientTokens;
}
private HashSet<string> GetRunningClientTokens()
{
var runningClientTokens = new HashSet<string>();
// Only deserialize if greater than one
if (ApplicationController.ApplicationInstanceCount > 1)
{
try
{
string json = get(runningTokensKeyName);
if (!string.IsNullOrEmpty(json))
{
runningClientTokens = JsonConvert.DeserializeObject<HashSet<string>>(json);
}
}
catch { }
}
return runningClientTokens;
}
private void SetRunningClientTokens(HashSet<string> runningClientTokens)
{
set(runningTokensKeyName, JsonConvert.SerializeObject(runningClientTokens));
}
public void SetClientToken(string clientToken)
{
// Clear credentials anytime we are allocated a new client token
AuthenticationData.Instance.ClearActiveSession();
int allocatedCount = 0;
bool firstEmptySlot = false;
do
{
string keyName = $"{ApplicationController.EnvironmentName}ClientToken";
if (allocatedCount > 0)
{
keyName += "_" + allocatedCount;
}
firstEmptySlot = string.IsNullOrEmpty(get(keyName));
if (firstEmptySlot)
{
set(keyName, clientToken);
}
allocatedCount++;
} while (!firstEmptySlot);
}
public string get(string key)
{
string result;
if (settingsDictionary == null)
{
globalInstance.LoadData();
}
if (settingsDictionary.ContainsKey(key))
{
result = settingsDictionary[key].Value;
}
else
{
result = null;
}
return result;
}
public void set(string key, string value)
{
SystemSetting setting;
if (settingsDictionary.ContainsKey(key))
{
setting = settingsDictionary[key];
}
else
{
setting = new SystemSetting();
setting.Name = key;
settingsDictionary[key] = setting;
}
setting.Value = value;
setting.Commit();
}
private void LoadData()
{
settingsDictionary = new Dictionary<string, SystemSetting>();
foreach (SystemSetting s in GetApplicationSettings())
{
settingsDictionary[s.Name] = s;
}
}
private IEnumerable<SystemSetting> GetApplicationSettings()
{
//Retrieve SystemSettings from the Datastore
return Datastore.Instance.dbSQLite.Query<SystemSetting>("SELECT * FROM SystemSetting;");
}
}
}