diff --git a/ApplicationView/MainApplicationWidget.cs b/ApplicationView/MainApplicationWidget.cs index deeda5325..63c9f041a 100644 --- a/ApplicationView/MainApplicationWidget.cs +++ b/ApplicationView/MainApplicationWidget.cs @@ -50,7 +50,18 @@ namespace MatterHackers.MatterControl { using Agg.Font; using System.Reflection; - using OemProfileDictionary = Dictionary>; + + public class OemProfileDictionary : Dictionary> + { + } + + public class PublicDevice + { + public string DeviceToken { get; set; } + public string ProfileToken { get; set; } + public string ShortProfileID { get; set; } + public string CacheKey => this.ShortProfileID + ProfileManager.ProfileExtension; + } public abstract class ApplicationView : GuiWidget { @@ -276,11 +287,7 @@ namespace MatterHackers.MatterControl /// public async static Task LoadCacheableAsync(string cacheKey, string cacheScope, Func> collector, string staticDataFallbackPath = null) where T : class { - string cacheDirectory = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "temp", "cache", cacheScope); - string cachePath = Path.Combine(cacheDirectory, cacheKey); - - // Ensure directory exists - Directory.CreateDirectory(cacheDirectory); + string cachePath = CacheablePath(cacheScope, cacheKey); try { @@ -289,13 +296,13 @@ namespace MatterHackers.MatterControl if (item != null) { // update cache on success - File.WriteAllText(cachePath, JsonConvert.SerializeObject(item)); + File.WriteAllText(cachePath, JsonConvert.SerializeObject(item, Formatting.Indented)); return item; } } catch { - // fall back to preexisting cache if failed + // Fall back to preexisting cache if failed } try @@ -308,7 +315,7 @@ namespace MatterHackers.MatterControl } catch { - //Fallback to Static Data + // Fall back to StaticData } try @@ -327,6 +334,19 @@ namespace MatterHackers.MatterControl return default(T); } + private static string cacheDirectory = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "temp", "cache"); + + internal static string CacheablePath(string cacheScope, string cacheKey) + { + string scopeDirectory = Path.Combine(cacheDirectory, cacheScope); + + // Ensure directory exists + Directory.CreateDirectory(scopeDirectory); + + string cachePath = Path.Combine(scopeDirectory, cacheKey); + return cachePath; + } + public void StartSignOut() { if (PrinterConnectionAndCommunication.Instance.PrinterIsPrinting diff --git a/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs b/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs index 1fa1bfb31..e8dbd1926 100644 --- a/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs +++ b/PrinterControls/PrinterConnections/SetupStepMakeModelName.cs @@ -192,15 +192,15 @@ namespace MatterHackers.MatterControl.PrinterControls.PrinterConnections activeModel = null; // Select the dictionary containing the printerName->printerToken mappings for the current OEM - Dictionary printers; + Dictionary printers; if (!OemSettings.Instance.OemProfiles.TryGetValue(activeMake, out printers)) { // Fall back to an empty dictionary if no match - printers = new Dictionary(); + printers = new Dictionary(); } // Models - sort dictionary results by key and assign to .ListSource - printerModelSelector.ListSource = printers.OrderBy(p => p.Key).ToList(); + printerModelSelector.ListSource = printers.OrderBy(p => p.Key).Select(p => new KeyValuePair(p.Key, p.Value.ProfileToken)).ToList(); if (printerModelSelector.MenuItems.Count == 1) { // SelectIfOnlyOneModel diff --git a/SettingsManagement/OemSettings.cs b/SettingsManagement/OemSettings.cs index b4e7449c1..166c22b7e 100644 --- a/SettingsManagement/OemSettings.cs +++ b/SettingsManagement/OemSettings.cs @@ -45,7 +45,6 @@ using System.Threading.Tasks; namespace MatterHackers.MatterControl.SettingsManagement { using Agg.UI; - using OemProfileDictionary = Dictionary>; public class OemSettings { @@ -167,12 +166,16 @@ namespace MatterHackers.MatterControl.SettingsManagement var oemProfiles = await ApplicationController.LoadCacheableAsync( "oemprofiles.json", - "profiles", + "public-profiles", ApplicationController.GetPublicProfileList); // If we failed to get anything from load cacheable don't override potentially populated fields if (oemProfiles != null) { + // TODO: we're rebuilding this data at whatever inteval we poll. It should only happen when we download a new document, + // never when we load from cache. A possible fix would be to move this code into a lamdba above so that it's only executed if GetPublicProfileList + // returns a non-null value. + // OemProfiles = oemProfiles; var manufactures = oemProfiles.Keys.ToDictionary(oem => oem); @@ -184,36 +187,27 @@ namespace MatterHackers.MatterControl.SettingsManagement private async Task DownloadMissingProfiles(IProgress syncReport) { - string cacheDirectory = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "temp", "cache", "profiles"); SyncReportType reportValue = new SyncReportType(); int index = 0; foreach (string oem in OemProfiles.Keys) { - index++; - foreach (string profileKey in OemProfiles[oem].Values) - { - string cacheKey = profileKey + ProfileManager.ProfileExtension; - string cachePath = Path.Combine(cacheDirectory, cacheKey); + string cacheScope = Path.Combine("public-profiles", oem); + index++; + foreach (var publicDevice in OemProfiles[oem].Values) + { + string cachePath = ApplicationController.CacheablePath(cacheScope, publicDevice.CacheKey); if (!File.Exists(cachePath)) { - var profile = await ApplicationController.DownloadPublicProfileAsync(profileKey); - if(profile != null) + await ProfileManager.LoadOemProfileAsync(publicDevice, oem); + + if (syncReport != null) { - string profileJson = JsonConvert.SerializeObject(profile); - if (!String.IsNullOrEmpty(profileJson)) - { - File.WriteAllText(cachePath, profileJson); - } - if (syncReport != null) - { - reportValue.actionLabel = String.Format("Downloading public profiles for {0}...", oem); - reportValue.percComplete = (double)index / OemProfiles.Count; - syncReport.Report(reportValue); - } + reportValue.actionLabel = String.Format("Downloading public profiles for {0}...", oem); + reportValue.percComplete = (double)index / OemProfiles.Count; + syncReport.Report(reportValue); } } - } } } diff --git a/SlicerConfiguration/Settings/PrinterSettings.cs b/SlicerConfiguration/Settings/PrinterSettings.cs index 12223cbb6..96b09c922 100644 --- a/SlicerConfiguration/Settings/PrinterSettings.cs +++ b/SlicerConfiguration/Settings/PrinterSettings.cs @@ -329,8 +329,10 @@ namespace MatterHackers.MatterControl.SlicerConfiguration try { - string publicProfileDeviceToken = OemSettings.Instance.OemProfiles[profile.Make][profile.Model]; - string publicProfileToLoad = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "temp", "cache", "profiles", publicProfileDeviceToken + ProfileManager.ProfileExtension); + var publicDevice = OemSettings.Instance.OemProfiles[profile.Make][profile.Model]; + string cacheScope = Path.Combine("public-profiles", profile.Make); + + string publicProfileToLoad = ApplicationController.CacheablePath(cacheScope, publicDevice.CacheKey); oemProfile = JsonConvert.DeserializeObject(File.ReadAllText(publicProfileToLoad)); oemProfile.ID = profile.ID; diff --git a/SlicerConfiguration/Settings/ProfileManager.cs b/SlicerConfiguration/Settings/ProfileManager.cs index 6c91aacfb..d301f3af5 100644 --- a/SlicerConfiguration/Settings/ProfileManager.cs +++ b/SlicerConfiguration/Settings/ProfileManager.cs @@ -387,7 +387,12 @@ namespace MatterHackers.MatterControl.SlicerConfiguration { string guid = Guid.NewGuid().ToString(); - var newProfile = await LoadHttpOemProfile(make, model); + var publicDevice = OemSettings.Instance.OemProfiles[make][model]; + + // TODO: jlewin - how can we handle lookup failures at this point? Should we throw and check for the exception? + //if (publicDevice == null) + + var newProfile = await LoadOemProfileAsync(publicDevice, make); newProfile.ID = guid; newProfile.DocumentVersion = PrinterSettings.LatestVersion; @@ -463,28 +468,31 @@ namespace MatterHackers.MatterControl.SlicerConfiguration "Pink - Light", }; - private async static Task LoadHttpOemProfile(string make, string model) + public async static Task LoadOemProfileAsync(PublicDevice publicDevice, string make) { - string deviceToken = OemSettings.Instance.OemProfiles[make][model]; - string cacheKey = deviceToken + ProfileManager.ProfileExtension; - string cachePath = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "data", "temp", "cache", "profiles", cacheKey); + string cacheScope = Path.Combine("public-profiles", make); + string cachePath = ApplicationController.CacheablePath(cacheScope, publicDevice.CacheKey); return await ApplicationController.LoadCacheableAsync( - cacheKey, - "profiles", + publicDevice.CacheKey, + cacheScope, async () => { + // The collector specifically returns null to ensure LoadCacheable skips writing the + // result to the cache. After this result is returned, it will attempt to load from + // the local cache if the collector yielded no result if(File.Exists(cachePath)) { return null; } else { - // If the cache file for the current deviceToken does not exist, attempt to download it - return await ApplicationController.DownloadPublicProfileAsync(deviceToken); + // If the cache file for the current deviceToken does not exist, attempt to download it. + // An http 304 results in a null value and LoadCacheable will then load from the cache + return await ApplicationController.DownloadPublicProfileAsync(publicDevice.ProfileToken); } }, - Path.Combine("Profiles",make, model + ProfileManager.ProfileExtension)); + Path.Combine("Profiles", make, make + ProfileManager.ProfileExtension)); } public void EnsurePrintersImported() diff --git a/StaticData/Profiles/oemprofiles.json b/StaticData/Profiles/oemprofiles.json index 8cd28c98d..8c9059634 100644 --- a/StaticData/Profiles/oemprofiles.json +++ b/StaticData/Profiles/oemprofiles.json @@ -1 +1,10 @@ -{"BCN": {"Sigma": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDat5cKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}, "PrintrBot": {"Simple metal": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAwOGKCgwLEg1EZXZpY2VQcm9maWxlGICAgIDAtZsKDA", "Simple": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAwKuGCgwLEg1EZXZpY2VQcm9maWxlGICAgIDAiJ0JDA", "Printrbot PLUS": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAwPqTCgwLEg1EZXZpY2VQcm9maWxlGICAgICA5JEJDA", "Metal Plus (Dual)": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA5JEKDA", "Metal Plus": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgICAw5UKDA", "Printerbot LC": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAwJyCCgwLEg1EZXZpY2VQcm9maWxlGICAgICAgIAJDA", "Printerbot Jr": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAgNeMCgwLEg1EZXZpY2VQcm9maWxlGICAgIDAiJ0KDA", "Metal Plus (Heated Bed)": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC63J8KDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgICArpkKDA"}, "MakerGear": {"M2.printer": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID47Z0JDAsSBkRldmljZRiAgICAwIidCgwLEg1EZXZpY2VQcm9maWxlGICAgIDAnIIKDA", "M2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID47Z0JDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}, "Blue Eagle Labs": {"Kossel Clear": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID47Z0KDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}, "Maker's Tool Works": {"MendelMax 3 (Dual Extrusion)": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgJDAsSBkRldmljZRiAgICAgK6ZCgwLEg1EZXZpY2VQcm9maWxlGICAgICw2IIKDA", "MendelMax 2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgJDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgIDQz50KDA", "MendelMax 3": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgJDAsSBkRldmljZRiAgICAgMOVCgwLEg1EZXZpY2VQcm9maWxlGICAgICwgpMKDA", "MiniMax": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgJDAsSBkRldmljZRiAgICAgICACQwLEg1EZXZpY2VQcm9maWxlGICAgICwlooKDA", "Fusematic": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgJDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDQ_oQJDA"}, "MAKEiT": {"Pro.printer": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4KDAsSBkRldmljZRiAgICAgMOVCgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA", "Pro": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4KDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDAiJ0KDA"}, "JumpStart": {"V1": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICAuYQKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDAtZsKDA"}, "Solidoodle": {"Solidoodle Workbench": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDepYUKDAsSBkRldmljZRiAgICAwPqTCgwLEg1EZXZpY2VQcm9maWxlGICAgIDw1J8KDA", "Solidoodle 4": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDepYUKDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgICwu5cKDA", "Solidoodle Workbench Apprentice": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDepYUKDAsSBkRldmljZRiAgICAwJyCCgwLEg1EZXZpY2VQcm9maWxlGICAgIDwoI4KDA", "Solidoodle Press": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDepYUKDAsSBkRldmljZRiAgICAgNeMCgwLEg1EZXZpY2VQcm9maWxlGICAgICwgpMJDA", "Solidoodle 2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDepYUKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICw7YYKDA", "Solidoodle 3": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDepYUKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgICw2IIJDA"}, "Revolution 3D Printers": {"INF3D-AF1-SE": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICZ56MLDAsSBkRldmljZRiAgICAgOSRCgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA", "INF3D-AF1-DE": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICZ56MJDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA"}, "Prusa Research": {"i3 MK2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICbpYIKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICAw5UKDA"}, "3D Stuffmaker": {"Core": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDejJAKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICwgpMKDA", "Evolution": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDejJAKDAsSBkRldmljZRiAgICAwOGKCgwLEg1EZXZpY2VQcm9maWxlGICAgICw8ZsKDA", "Mega i3": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDejJAKDAsSBkRldmljZRiAgICAoMSOCgwLEg1EZXZpY2VQcm9maWxlGICAgICwu5cKDA", "Creator": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDejJAKDAsSBkRldmljZRiAgICAgOSRCQwLEg1EZXZpY2VQcm9maWxlGICAgICwlooKDA", "i3 Plus+": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDejJAKDAsSBkRldmljZRiAgICAwKuGCgwLEg1EZXZpY2VQcm9maWxlGICAgICw7YYKDA", "Creator.printer": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDejJAKDAsSBkRldmljZRiAgICA0IyICgwLEg1EZXZpY2VQcm9maWxlGICAgIDQjIgJDA"}, "Tosingraf": {"3DPrint": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICv4ZkKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICgjoEJDA", "Cover 3DPrint": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICv4ZkKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgIDgsIUKDA", "Cover Engraving": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICv4ZkKDAsSBkRldmljZRiAgICAgICACQwLEg1EZXZpY2VQcm9maWxlGICAgIDgrJQKDA"}, "MakerBot": {"Replicator 2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvnJEJDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDQpZUKDA", "Replicator 2X": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvnJEJDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgIDQs4wKDA", "Replicator Z18": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvnJEJDAsSBkRldmljZRiAgICAgPKICwwLEg1EZXZpY2VQcm9maWxlGICAgICwgpMKDA", "Replicator 5th Gen": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvnJEJDAsSBkRldmljZRiAgICAgK6ZCgwLEg1EZXZpY2VQcm9maWxlGICAgIDQz50KDA", "Replicator Mini": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvnJEJDAsSBkRldmljZRiAgICAgMOVCgwLEg1EZXZpY2VQcm9maWxlGICAgICw2IIKDA"}, "Leapfrog": {"Creatr HS": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID4-4IKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICQx4AJDA", "Creatr.printer": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID4-4IKDAsSBkRldmljZRiAgICAkMmPCgwLEg1EZXZpY2VQcm9maWxlGICAgICQ3Z4KDA", "Creatr XL": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID4-4IKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgICQyY8JDA", "Creatr": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID4-4IKDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgIDQjIgKDA", "Xeed": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID4-4IKDAsSBkRldmljZRiAgICAgNeMCgwLEg1EZXZpY2VQcm9maWxlGICAgICQ-JoJDA"}, "OpenBeam": {"Kossel Pro": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICEoJMKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}, "IRA3D": {"Poetry Infinity": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvnJEKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}, "Ultimaker": {"2 Extended": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4LDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDglYMKDA", "2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4LDAsSBkRldmljZRiAgICAgK6ZCgwLEg1EZXZpY2VQcm9maWxlGICAgIDg74sKDA", "2 Extended+": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4LDAsSBkRldmljZRiAgICAgICACQwLEg1EZXZpY2VQcm9maWxlGICAgIDgwZwKDA", "2+": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4LDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgIDgi5IKDA"}, "Revolutiom 3D Printers": {"INF3D-AF1-SE": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDAiJ0KDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgICArpkKDA", "INF3D-AF1-DE": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDAiJ0KDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA5JEKDA"}, "Organic Thinking System": {"DeltaBot-K": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICA14wKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}, "Velleman": {"K8200": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgMDIqoQKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA"}, "3D Factory": {"MendelMax 1.5": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDekIEKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICgxI4KDA"}, "Type A Machines": {"Series 1 Plywood": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID47Z0LDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDAnIIKDA"}, "Lulzbot": {"Mini": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICAw5UKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDwoI4KDA", "TAZ 4": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICAw5UKDAsSBkRldmljZRiAgICAwLWbCgwLEg1EZXZpY2VQcm9maWxlGICAgICwu5cJDA", "TAZ 5": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICAw5UKDAsSBkRldmljZRiAgICAwN-XCgwLEg1EZXZpY2VQcm9maWxlGICAgIDQz50JDA", "TAZ 6": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICAw5UKDAsSBkRldmljZRiAgICAgMOVCQwLEg1EZXZpY2VQcm9maWxlGICAgIDw1J8KDA", "TAZ": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICAw5UKDAsSBkRldmljZRiAgICAwJyCCgwLEg1EZXZpY2VQcm9maWxlGICAgIDw1J8JDA", "TAZ 6 Software Leveling": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICAw5UKDAsSBkRldmljZRiAgICAgMOVCgwLEg1EZXZpY2VQcm9maWxlGICAgIDQz50LDA"}, "Deezmaker": {"Bukito": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICg_YkKDA", "Bukobot v2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgICg55gKDA"}, "Airwolf 3D": {"XL": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAwIidCQwLEg1EZXZpY2VQcm9maWxlGICAgIDIgJoKDA", "HD2x": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgICIvI0JDA", "HDx": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAwPqTCgwLEg1EZXZpY2VQcm9maWxlGICAgICIzZIJDA", "v5.5": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAgMOVCQwLEg1EZXZpY2VQcm9maWxlGICAgICIm4sKDA", "HD-R": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAgPKICQwLEg1EZXZpY2VQcm9maWxlGICAgICIppwKDA", "HDL": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAgNeMCgwLEg1EZXZpY2VQcm9maWxlGICAgICIzZIKDA", "Axiom": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgIDwhYkLDA", "HD": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtsYMKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICI0YMKDA"}, "FlashForge": {"Creator Pro Dual": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICA8ogKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDQkJEKDA", "Creator X Dual": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICA8ogKDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgIDQjIgKDA", "Creator.printer": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICA8ogKDAsSBkRldmljZRiAgICAkMmPCgwLEg1EZXZpY2VQcm9maWxlGICAgICQ3Z4KDA", "Creator Dual": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICA8ogKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgICQx4AKDA", "Creator": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICA8ogKDAsSBkRldmljZRiAgICAgNeMCgwLEg1EZXZpY2VQcm9maWxlGICAgIDQ6pkKDA"}, "ROBO 3D": {"R1 & R1 + Plus": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe6okKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA5JEKDA", "R1 & R1 +Plus": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvhogKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA"}, "SeeMeCNC": {"Rostock MAX": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDt24sKDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgIDglYMKDA", "Orion": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDt24sKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgIDgrJQJDA", "Eris": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDt24sKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDgwZwKDA", "Eris.printer": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDt24sKDAsSBkRldmljZRiAgICAoJmQCgwLEg1EZXZpY2VQcm9maWxlGICAgICg_YkKDA"}, "Portabee": {"GO": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICZzpQKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA5JEKDA", "Portabee GO": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICZzpQKDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgIDA4YoKDA"}, "Me3D": {"Me2.printer": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4JDAsSBkRldmljZRiAgICAwIidCgwLEg1EZXZpY2VQcm9maWxlGICAgIDAnIIKDA", "Me2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC6qI4JDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDAiJ0JDA"}, "BeeVeryCreative": {"BeeTheFirst": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID4iYwKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDAiJ0JDA"}, "M3D": {"Micro with iMe Firmware": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICvv8wLDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDAnIIKDA"}, "Printrbot": {"Metal Plus (Dual Extrusion)": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDvxN0JDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA", "Simple Metal": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC-lpILDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA", "Simple": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIC-8YsLDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA", "Printrbot PLUS": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDrot4IDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA", "Printrbot Jr": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDvxN0LDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICg55gKDA", "Metal Plus (No Heated Bed)": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICfsJcKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA", "Printrbot LC": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICditYKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA", "Metal Plus (Heated Bed)": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICdt5EKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA"}, "gCreate": {"gMax": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDtrZIKDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}, "Wanhao": {"Duplicator i3": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgID4-4IJDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICA14wKDA"}, "Other": {"Prusa i3": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAoI6BCgwLEg1EZXZpY2VQcm9maWxlGICAgIDw1J8KDA", "EHuxley": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgICw7YYKDA", "Sailfish (X3G)": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAwPqTCgwLEg1EZXZpY2VQcm9maWxlGICAgIDA4YoKDA", "Prusia i3": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAgLmECQwLEg1EZXZpY2VQcm9maWxlGICAgIDAnIIKDA", "Other": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAgNeMCgwLEg1EZXZpY2VQcm9maWxlGICAgICw7YYJDA", "Mendel90": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAgPKICgwLEg1EZXZpY2VQcm9maWxlGICAgICwu5cKDA", "X3G": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAoJmQCgwLEg1EZXZpY2VQcm9maWxlGICAgIDwyoEKDA", "Mendelmax 2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAwN-XCgwLEg1EZXZpY2VQcm9maWxlGICAgIDwoI4KDA", "MendelMax 2": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgIDe_pgLDAsSBkRldmljZRiAgICAgLmECgwLEg1EZXZpY2VQcm9maWxlGICAgICAw5UKDA"}, "PrintSpace": {"Altair": "ahRzfm1hdHRlcmNvbnRyb2wtdGVzdHJDCxIJQWZmaWxpYXRlGICAgICZmY0KDAsSBkRldmljZRiAgICAgICACgwLEg1EZXZpY2VQcm9maWxlGICAgIDA-pMKDA"}} \ No newline at end of file +{ + "MatterHackers": { + "Series 1": { + "DeviceToken": "ahZkZXZ-bWF0dGVyY29udHJvbC10ZXN0cikLEglBZmZpbGlhdGUYgICAgICA4AkMCxIGRGV2aWNlGICAgICAgPAIDA", + "ProfileToken": "ahZkZXZ-bWF0dGVyY29udHJvbC10ZXN0ckMLEglBZmZpbGlhdGUYgICAgICA4AkMCxIGRGV2aWNlGICAgICAgPAIDAsSDURldmljZVByb2ZpbGUYgICAgIDMgwkM", + "ShortProfileID": "Series 1-5082355060441088", + "CacheKey": "Series 1-5082355060441088.printer" + } + } +} \ No newline at end of file diff --git a/Tests/MatterControl.AutomationTests/RetrievePublicProfileTest.cs b/Tests/MatterControl.AutomationTests/RetrievePublicProfileTest.cs index 38e297f80..a3e2e8d0c 100644 --- a/Tests/MatterControl.AutomationTests/RetrievePublicProfileTest.cs +++ b/Tests/MatterControl.AutomationTests/RetrievePublicProfileTest.cs @@ -57,17 +57,9 @@ namespace MatterControl.Tests.MatterControl string make = OemSettings.Instance.OemProfiles.First().Key; string model = OemSettings.Instance.OemProfiles[make].First().Key; - string deviceToken = OemSettings.Instance.OemProfiles[make][model]; - string cacheKey = deviceToken + ProfileManager.ProfileExtension; + var publicDevice = OemSettings.Instance.OemProfiles[make][model]; - string expectedProfilePath = Path.Combine(ApplicationDataStorage.ApplicationUserDataPath, "Profiles", cacheKey); - if (File.Exists(expectedProfilePath)) - { - File.Delete(expectedProfilePath); - } - - // Test will fail until mechanism can be created that exposes MHWebservices to vanilla MatterControl or until these tests are moved to MCCentral - var recievedPrinterProfile = await ApplicationController.DownloadPublicProfileAsync(deviceToken); + var recievedPrinterProfile = await ApplicationController.DownloadPublicProfileAsync(publicDevice.ProfileToken); Assert.IsNotNull(recievedPrinterProfile);