From 50af36fb5fa1879191759526cad27a8226356e43 Mon Sep 17 00:00:00 2001 From: erri120 Date: Wed, 9 Oct 2019 16:44:42 +0200 Subject: [PATCH] Moved from FileStream to MemoryStream --- Wabbajack/AppState.cs | 86 +++++++++++++------------------------------ 1 file changed, 25 insertions(+), 61 deletions(-) diff --git a/Wabbajack/AppState.cs b/Wabbajack/AppState.cs index 7ae6d268..e4bbb8eb 100644 --- a/Wabbajack/AppState.cs +++ b/Wabbajack/AppState.cs @@ -398,50 +398,32 @@ namespace Wabbajack SplashScreenImage = _noneImage; if (element.ImageURL != null) { - string cachePath = Path.Combine(SlideshowCacheDir, element.ModID + ".slideshowcache"); // max cached files achieved - if(cachedSlides.Count >= MAX_CACHE_SIZE) { + if(_cachedSlides.Count >= MAX_CACHE_SIZE) { do { - // delete a random file to make room - // file can not be in the queue var idx = _random.Next(0, SlideShowElements.Count); var randomElement = SlideShowElements[idx]; - string randomPath = Path.Combine(SlideshowCacheDir, randomElement.ModID + ".slideshowcache"); - while (!File.Exists(randomPath) - || slidesQueue.Contains(randomElement)) + while(!_cachedSlides.ContainsKey(randomElement.ModID) || slidesQueue.Contains(randomElement)) { idx = _random.Next(0, SlideShowElements.Count); randomElement = SlideShowElements[idx]; - randomPath = Path.Combine(SlideshowCacheDir, randomElement.ModID + ".slideshowcache"); } - if (File.Exists(randomPath) && !IsFileLocked(randomPath)) + if (_cachedSlides.ContainsKey(randomElement.ModID)) { - File.Delete(randomPath); - cachedSlides.RemoveAt(cachedSlides.IndexOf(randomElement.ModID)); + _cachedSlides.Remove(randomElement.ModID); } - } while (cachedSlides.Count >= MAX_CACHE_SIZE); + } while (_cachedSlides.Count >= MAX_CACHE_SIZE); } if (!element.Adult || (element.Adult && SplashShowNSFW)) { dispatcher.Invoke(() => { - var data = new MemoryStream(); - if (!IsFileLocked(cachePath) && File.Exists(cachePath)) + if (_cachedSlides.ContainsKey(element.ModID)) { - using (var stream = new FileStream(cachePath, FileMode.Open, FileAccess.Read)) - stream.CopyTo(data); - - data.Seek(0, SeekOrigin.Begin); - var bitmap = new BitmapImage(); - bitmap.BeginInit(); - bitmap.CacheOption = BitmapCacheOption.OnLoad; - bitmap.StreamSource = data; - bitmap.EndInit(); - + _cachedSlides.TryGetValue(element.ModID, out bitmap); SplashScreenImage = bitmap; - } }); } @@ -460,8 +442,7 @@ namespace Wabbajack } } - private string SlideshowCacheDir; - private List cachedSlides; + private Dictionary _cachedSlides; private Queue slidesQueue; private SlideShowItem lastSlide; /// @@ -469,17 +450,17 @@ namespace Wabbajack /// /// The url /// The destination - private void CacheSlide(string url, string dest) + private void CacheSlide(string id, string url) { bool sync = false; - using (var file = new FileStream(dest, FileMode.Create, FileAccess.Write)) + using (var ms = new MemoryStream()) { if (sync) { dispatcher.Invoke(() => { using (var stream = new HttpClient().GetStreamSync(url)) - stream.CopyTo(file); + stream.CopyTo(ms); }); } else @@ -487,9 +468,19 @@ namespace Wabbajack using (var stream = new HttpClient().GetStreamAsync(url)) { stream.Wait(); - stream.Result.CopyTo(file); + stream.Result.CopyTo(ms); } } + ms.Seek(0, SeekOrigin.Begin); + dispatcher.Invoke(() => + { + var image = new BitmapImage(); + image.BeginInit(); + image.CacheOption = BitmapCacheOption.OnLoad; + image.StreamSource = ms; + image.EndInit(); + _cachedSlides.Add(id, image); + }); } } /// @@ -512,9 +503,6 @@ namespace Wabbajack } } - string id = element.ModID; - string cacheFile = Path.Combine(SlideshowCacheDir, id + ".slideshowcache"); - if(element.ImageURL == null) { if(!init) @@ -522,23 +510,17 @@ namespace Wabbajack } else { - // if the file doesen't exist, we cache it and add it to the cachedSlide list and to the - // slidesQueue - // return true for the PreloadSlideshow - if (!File.Exists(cacheFile)) + if (!_cachedSlides.ContainsKey(element.ModID)) { - CacheSlide(element.ImageURL, cacheFile); - cachedSlides.Add(id); + CacheSlide(element.ModID, element.ImageURL); slidesQueue.Enqueue(element); result = true; } - // if the file exists and was not called from preloadslideshow, we queue the slide else { if (!init) slidesQueue.Enqueue(element); } - // set the last element to the current element after queueing lastSlide = element; } return result; @@ -548,12 +530,9 @@ namespace Wabbajack /// private void PreloadSlideshow() { - cachedSlides = new List(); + _cachedSlides = new Dictionary(); slidesQueue = new Queue(); - if (!Directory.Exists(SlideshowCacheDir)) - Directory.CreateDirectory(SlideshowCacheDir); - int turns = 0; for(int i = 0; i < SlideShowElements.Count; i++) { @@ -566,18 +545,6 @@ namespace Wabbajack continue; } } - /// - /// Deletes the slideshow cache - /// - private void DeleteCache() - { - if (Directory.Exists(SlideshowCacheDir)) - { - foreach (string s in Directory.GetFiles(SlideshowCacheDir)) - File.Delete(s); - //Directory.Delete(SlideshowCacheDir); - } - } public bool Running { get; set; } = true; private void ApplyModlistProperties() @@ -641,8 +608,6 @@ namespace Wabbajack } internal void ConfigureForInstall(string source, ModList modlist) { - SlideshowCacheDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "slideshow_cache"); - DeleteCache(); _modList = modlist; _modListPath = source; @@ -700,7 +665,6 @@ namespace Wabbajack finally { UIReady = true; - DeleteCache(); Running = false; slideshowThread.Abort(); }