diff --git a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs index 13b6ac968da..0982e401715 100644 --- a/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs +++ b/Flow.Launcher.Core/Plugin/ExecutablePlugin.cs @@ -24,36 +24,16 @@ public ExecutablePlugin(string filename) }; } - protected override Task ExecuteQueryAsync(Query query, CancellationToken token) + protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default) { - JsonRPCServerRequestModel request = new JsonRPCServerRequestModel - { - Method = "query", - Parameters = new object[] {query.Search}, - }; - _startInfo.Arguments = $"\"{request}\""; - return ExecuteAsync(_startInfo, token); } - protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest) + protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default) { _startInfo.Arguments = $"\"{rpcRequest}\""; return Execute(_startInfo); } - - protected override string ExecuteContextMenu(Result selectedResult) - { - JsonRPCServerRequestModel request = new JsonRPCServerRequestModel - { - Method = "contextmenu", - Parameters = new object[] {selectedResult.ContextData}, - }; - - _startInfo.Arguments = $"\"{request}\""; - - return Execute(_startInfo); - } } } \ No newline at end of file diff --git a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs index 0df853a5d1f..65977219d8f 100644 --- a/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs +++ b/Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs @@ -30,16 +30,22 @@ internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu /// The language this JsonRPCPlugin support /// public abstract string SupportedLanguage { get; set; } - - protected abstract Task ExecuteQueryAsync(Query query, CancellationToken token); - protected abstract string ExecuteCallback(JsonRPCRequestModel rpcRequest); - protected abstract string ExecuteContextMenu(Result selectedResult); + protected abstract Task RequestAsync(JsonRPCRequestModel rpcRequest, CancellationToken token = default); + protected abstract string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default); private static readonly RecyclableMemoryStreamManager BufferManager = new(); public List LoadContextMenus(Result selectedResult) { - var output = ExecuteContextMenu(selectedResult); + var request = new JsonRPCRequestModel + { + Method = "context_menu", + Parameters = new[] + { + selectedResult.ContextData + } + }; + var output = Request(request); return DeserializedResult(output); } @@ -100,7 +106,7 @@ private List ParseResults(JsonRPCQueryResponseModel queryResponseModel) } else { - var actionResponse = ExecuteCallback(result.JsonRPCAction); + var actionResponse = Request(result.JsonRPCAction); if (string.IsNullOrEmpty(actionResponse)) { @@ -192,15 +198,6 @@ protected string Execute(ProcessStartInfo startInfo) return string.Empty; } - if (result.StartsWith("DEBUG:")) - { - MessageBox.Show(new Form - { - TopMost = true - }, result.Substring(6)); - return string.Empty; - } - return result; } catch (Exception e) @@ -255,8 +252,8 @@ protected async Task ExecuteAsync(ProcessStartInfo startInfo, Cancellati if (buffer.Length == 0) { - var errorMessage = process.StandardError.EndOfStream ? - "Empty JSONRPC Response" : + var errorMessage = process.StandardError.EndOfStream ? + "Empty JSONRPC Response" : await process.StandardError.ReadToEndAsync(); throw new InvalidDataException($"{context.CurrentPluginMetadata.Name}|{errorMessage}"); } @@ -283,7 +280,15 @@ protected async Task ExecuteAsync(ProcessStartInfo startInfo, Cancellati public async Task> QueryAsync(Query query, CancellationToken token) { - var output = await ExecuteQueryAsync(query, token); + var request = new JsonRPCRequestModel + { + Method = "query", + Parameters = new[] + { + query.Search + } + }; + var output = await RequestAsync(request, token); return await DeserializedResultAsync(output); } @@ -293,4 +298,4 @@ public virtual Task InitAsync(PluginInitContext context) return Task.CompletedTask; } } -} +} \ No newline at end of file diff --git a/Flow.Launcher.Core/Plugin/PythonPlugin.cs b/Flow.Launcher.Core/Plugin/PythonPlugin.cs index 5d2d8d51d43..5711ed6aae9 100644 --- a/Flow.Launcher.Core/Plugin/PythonPlugin.cs +++ b/Flow.Launcher.Core/Plugin/PythonPlugin.cs @@ -32,47 +32,28 @@ public PythonPlugin(string filename) _startInfo.ArgumentList.Add("-B"); } - protected override Task ExecuteQueryAsync(Query query, CancellationToken token) + protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default) { - JsonRPCServerRequestModel request = new JsonRPCServerRequestModel - { - Method = "query", Parameters = new object[] {query.Search}, - }; - _startInfo.ArgumentList[2] = request.ToString(); - // todo happlebao why context can't be used in constructor - _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory; - return ExecuteAsync(_startInfo, token); } - protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest) + protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default) { _startInfo.ArgumentList[2] = rpcRequest.ToString(); _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory; // TODO: Async Action return Execute(_startInfo); } - - protected override string ExecuteContextMenu(Result selectedResult) - { - JsonRPCServerRequestModel request = new JsonRPCServerRequestModel - { - Method = "context_menu", Parameters = new object[] {selectedResult.ContextData}, - }; - _startInfo.ArgumentList[2] = request.ToString(); - _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory; - - // TODO: Async Action - return Execute(_startInfo); - } - public override Task InitAsync(PluginInitContext context) { this.context = context; _startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath); _startInfo.ArgumentList.Add(""); + + _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory; + return Task.CompletedTask; } } diff --git a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs index 2b9512692f5..383650619ce 100644 --- a/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs +++ b/Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs @@ -18,19 +18,14 @@ internal class JsonRPCPluginTest : JsonRPCPlugin { public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable; - protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest) + protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default) { throw new System.NotImplementedException(); } - protected override string ExecuteContextMenu(Result selectedResult) + protected override Task RequestAsync(JsonRPCRequestModel request, CancellationToken token = default) { - throw new System.NotImplementedException(); - } - - protected override Task ExecuteQueryAsync(Query query, CancellationToken token) - { - var byteInfo = Encoding.UTF8.GetBytes(query.RawQuery); + var byteInfo = Encoding.UTF8.GetBytes(request.Parameters[0] as string ?? string.Empty); var resultStream = new MemoryStream(byteInfo); return Task.FromResult((Stream)resultStream); @@ -45,7 +40,7 @@ public async Task GivenVariousJsonText_WhenVariousNamingCase_ThenExpectNotNullRe { var results = await QueryAsync(new Query { - RawQuery = resultText + Search = resultText }, default); Assert.IsNotNull(results); @@ -85,8 +80,8 @@ public async Task GivenModel_WhenSerializeWithDifferentNamingPolicy_ThenExpectSa var pascalText = JsonSerializer.Serialize(reference); - var results1 = await QueryAsync(new Query { RawQuery = camelText }, default); - var results2 = await QueryAsync(new Query { RawQuery = pascalText }, default); + var results1 = await QueryAsync(new Query { Search = camelText }, default); + var results2 = await QueryAsync(new Query { Search = pascalText }, default); Assert.IsNotNull(results1); Assert.IsNotNull(results2);