adjust concurrency, fix upload crash
This commit is contained in:
		| @@ -260,10 +260,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase | |||||||
|         }).ConfigureAwait(false); |         }).ConfigureAwait(false); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public string GetCustomizePlusScale() |     public async Task<string> GetCustomizePlusScale() | ||||||
|     { |     { | ||||||
|         if (!CheckCustomizePlusApi()) return string.Empty; |         if (!CheckCustomizePlusApi()) return string.Empty; | ||||||
|         var scale = _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.PlayerName); |         var scale = await _dalamudUtil.RunOnFrameworkThread(() => _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.PlayerName)).ConfigureAwait(false); | ||||||
|         if (string.IsNullOrEmpty(scale)) return string.Empty; |         if (string.IsNullOrEmpty(scale)) return string.Empty; | ||||||
|         return Convert.ToBase64String(Encoding.UTF8.GetBytes(scale)); |         return Convert.ToBase64String(Encoding.UTF8.GetBytes(scale)); | ||||||
|     } |     } | ||||||
| @@ -310,7 +310,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public string GlamourerGetCharacterCustomization(IntPtr character) |     public async Task<string> GlamourerGetCharacterCustomization(IntPtr character) | ||||||
|     { |     { | ||||||
|         if (!CheckGlamourerApi()) return string.Empty; |         if (!CheckGlamourerApi()) return string.Empty; | ||||||
|         try |         try | ||||||
| @@ -318,7 +318,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase | |||||||
|             var gameObj = _dalamudUtil.CreateGameObject(character); |             var gameObj = _dalamudUtil.CreateGameObject(character); | ||||||
|             if (gameObj is Character c) |             if (gameObj is Character c) | ||||||
|             { |             { | ||||||
|                 var glamourerString = _glamourerGetAllCustomization!.InvokeFunc(c); |                 var glamourerString = await _dalamudUtil.RunOnFrameworkThread(() => _glamourerGetAllCustomization!.InvokeFunc(c)).ConfigureAwait(false); | ||||||
|                 byte[] bytes = Convert.FromBase64String(glamourerString); |                 byte[] bytes = Convert.FromBase64String(glamourerString); | ||||||
|                 // ignore transparency |                 // ignore transparency | ||||||
|                 bytes[88] = 128; |                 bytes[88] = 128; | ||||||
| @@ -361,10 +361,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase | |||||||
|         }).ConfigureAwait(false); |         }).ConfigureAwait(false); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public string PalettePlusBuildPalette() |     public async Task<string> PalettePlusBuildPalette() | ||||||
|     { |     { | ||||||
|         if (!CheckPalettePlusApi()) return string.Empty; |         if (!CheckPalettePlusApi()) return string.Empty; | ||||||
|         var palette = _palettePlusBuildCharaPalette.InvokeFunc(_dalamudUtil.PlayerCharacter); |         var palette = await _dalamudUtil.RunOnFrameworkThread(() => _palettePlusBuildCharaPalette.InvokeFunc(_dalamudUtil.PlayerCharacter)).ConfigureAwait(false); | ||||||
|         if (string.IsNullOrEmpty(palette)) return string.Empty; |         if (string.IsNullOrEmpty(palette)) return string.Empty; | ||||||
|         return Convert.ToBase64String(Encoding.UTF8.GetBytes(palette)); |         return Convert.ToBase64String(Encoding.UTF8.GetBytes(palette)); | ||||||
|     } |     } | ||||||
| @@ -434,9 +434,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase | |||||||
|         logger.LogTrace("[{applicationId}] RemoveTemporaryCollection: {ret2}", applicationId, ret2); |         logger.LogTrace("[{applicationId}] RemoveTemporaryCollection: {ret2}", applicationId, ret2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public (string[] forward, string[][] reverse) PenumbraResolvePaths(string[] forward, string[] reverse) |     public async Task<(string[] forward, string[][] reverse)> PenumbraResolvePaths(string[] forward, string[] reverse) | ||||||
|     { |     { | ||||||
|         return _penumbraResolvePaths.Invoke(forward, reverse); |         return await _dalamudUtil.RunOnFrameworkThread(() => _penumbraResolvePaths.Invoke(forward, reverse)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void PenumbraSetTemporaryMods(ILogger logger, Guid applicationId, string characterName, int? idx, Dictionary<string, string> modPaths, string manipulationData) |     public void PenumbraSetTemporaryMods(ILogger logger, Guid applicationId, string characterName, int? idx, Dictionary<string, string> modPaths, string manipulationData) | ||||||
|   | |||||||
| @@ -323,9 +323,9 @@ public class PlayerDataFactory | |||||||
|         // gather up data from ipc |         // gather up data from ipc | ||||||
|         previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); |         previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); | ||||||
|         previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); |         previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); | ||||||
|         Task<string> getGlamourerData = Task.Run(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address)); |         Task<string> getGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address); | ||||||
|         Task<string> getCustomizeData = Task.Run(_ipcManager.GetCustomizePlusScale); |         Task<string> getCustomizeData = _ipcManager.GetCustomizePlusScale(); | ||||||
|         Task<string> getPalettePlusData = Task.Run(_ipcManager.PalettePlusBuildPalette); |         Task<string> getPalettePlusData = _ipcManager.PalettePlusBuildPalette(); | ||||||
|         previousData.GlamourerString[playerRelatedObject.ObjectKind] = await getGlamourerData.ConfigureAwait(false); |         previousData.GlamourerString[playerRelatedObject.ObjectKind] = await getGlamourerData.ConfigureAwait(false); | ||||||
|         _logger.LogDebug("Glamourer is now: {data}", previousData.GlamourerString[playerRelatedObject.ObjectKind]); |         _logger.LogDebug("Glamourer is now: {data}", previousData.GlamourerString[playerRelatedObject.ObjectKind]); | ||||||
|         previousData.CustomizePlusScale = await getCustomizeData.ConfigureAwait(false); |         previousData.CustomizePlusScale = await getCustomizeData.ConfigureAwait(false); | ||||||
| @@ -335,7 +335,7 @@ public class PlayerDataFactory | |||||||
|  |  | ||||||
|         // gather static replacements from render model |         // gather static replacements from render model | ||||||
|         var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token); |         var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token); | ||||||
|         Dictionary<string, List<string>> resolvedPaths = GetFileReplacementsFromPaths(forwardResolve, reverseResolve); |         Dictionary<string, List<string>> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false); | ||||||
|         previousData.FileReplacements[objectKind] = |         previousData.FileReplacements[objectKind] = | ||||||
|                 new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) |                 new HashSet<FileReplacement>(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) | ||||||
|                 .Where(p => p.HasFileReplacement).ToHashSet(); |                 .Where(p => p.HasFileReplacement).ToHashSet(); | ||||||
| @@ -363,7 +363,7 @@ public class PlayerDataFactory | |||||||
|  |  | ||||||
|         // get all remaining paths and resolve them |         // get all remaining paths and resolve them | ||||||
|         var transientPaths = ManageSemiTransientData(objectKind, charaPointer); |         var transientPaths = ManageSemiTransientData(objectKind, charaPointer); | ||||||
|         var resolvedTransientPaths = GetFileReplacementsFromPaths(transientPaths, new HashSet<string>(StringComparer.Ordinal)); |         var resolvedTransientPaths = await GetFileReplacementsFromPaths(transientPaths, new HashSet<string>(StringComparer.Ordinal)).ConfigureAwait(false); | ||||||
|  |  | ||||||
|         _logger.LogDebug("== Transient Replacements =="); |         _logger.LogDebug("== Transient Replacements =="); | ||||||
|         foreach (var replacement in resolvedTransientPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)).OrderBy(f => f.ResolvedPath, StringComparer.Ordinal)) |         foreach (var replacement in resolvedTransientPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)).OrderBy(f => f.ResolvedPath, StringComparer.Ordinal)) | ||||||
| @@ -387,12 +387,12 @@ public class PlayerDataFactory | |||||||
|         return previousData; |         return previousData; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private Dictionary<string, List<string>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve) |     private async Task<Dictionary<string, List<string>>> GetFileReplacementsFromPaths(HashSet<string> forwardResolve, HashSet<string> reverseResolve) | ||||||
|     { |     { | ||||||
|         var forwardPaths = forwardResolve.ToArray(); |         var forwardPaths = forwardResolve.ToArray(); | ||||||
|         var reversePaths = reverseResolve.ToArray(); |         var reversePaths = reverseResolve.ToArray(); | ||||||
|         Dictionary<string, List<string>> resolvedPaths = new(StringComparer.Ordinal); |         Dictionary<string, List<string>> resolvedPaths = new(StringComparer.Ordinal); | ||||||
|         var (forward, reverse) = _ipcManager.PenumbraResolvePaths(forwardPaths, reversePaths); |         var (forward, reverse) = await _ipcManager.PenumbraResolvePaths(forwardPaths, reversePaths).ConfigureAwait(false); | ||||||
|         for (int i = 0; i < forwardPaths.Length; i++) |         for (int i = 0; i < forwardPaths.Length; i++) | ||||||
|         { |         { | ||||||
|             var filePath = forward[i].ToLowerInvariant(); |             var filePath = forward[i].ToLowerInvariant(); | ||||||
|   | |||||||
| @@ -113,20 +113,20 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void Initialize(string name) |     public async Task Initialize(string name) | ||||||
|     { |     { | ||||||
|         PlayerName = name; |         PlayerName = name; | ||||||
|         _charaHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero, false); |         _charaHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero, false); | ||||||
|  |  | ||||||
|         _originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter); |         _originalGlamourerData = await _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false); | ||||||
|         _lastGlamourerData = _originalGlamourerData; |         _lastGlamourerData = _originalGlamourerData; | ||||||
|         Mediator.Subscribe<PenumbraRedrawMessage>(this, IpcManagerOnPenumbraRedrawEvent); |         Mediator.Subscribe<PenumbraRedrawMessage>(this, IpcManagerOnPenumbraRedrawEvent); | ||||||
|         Mediator.Subscribe<CharacterChangedMessage>(this, (msg) => |         Mediator.Subscribe<CharacterChangedMessage>(this, async (msg) => | ||||||
|         { |         { | ||||||
|             if (msg.GameObjectHandler == _charaHandler && (_applicationTask?.IsCompleted ?? true)) |             if (msg.GameObjectHandler == _charaHandler && (_applicationTask?.IsCompleted ?? true)) | ||||||
|             { |             { | ||||||
|                 Logger.LogTrace("Saving new Glamourer Data for {this}", this); |                 Logger.LogTrace("Saving new Glamourer Data for {this}", this); | ||||||
|                 _lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter); |                 _lastGlamourerData = await _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false); | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -182,8 +182,15 @@ public sealed class FileUploadManager : DisposableMediatorSubscriberBase | |||||||
|         using var ms = new MemoryStream(compressedFile); |         using var ms = new MemoryStream(compressedFile); | ||||||
|  |  | ||||||
|         Progress<UploadProgress> prog = new((prog) => |         Progress<UploadProgress> prog = new((prog) => | ||||||
|  |         { | ||||||
|  |             try | ||||||
|             { |             { | ||||||
|                 CurrentUploads.Single(f => string.Equals(f.Hash, fileHash, StringComparison.Ordinal)).Transferred = prog.Uploaded; |                 CurrentUploads.Single(f => string.Equals(f.Hash, fileHash, StringComparison.Ordinal)).Transferred = prog.Uploaded; | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 Logger.LogWarning(ex, "[{hash}] Could not set upload progress", fileHash); | ||||||
|  |             } | ||||||
|         }); |         }); | ||||||
|         var streamContent = new ProgressableStreamContent(ms, prog); |         var streamContent = new ProgressableStreamContent(ms, prog); | ||||||
|         streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); |         streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Stanley Dimant
					Stanley Dimant