Skip to content

Commit

Permalink
WIP event listener from webservice to pwsh #8
Browse files Browse the repository at this point in the history
  • Loading branch information
megastary committed Sep 1, 2021
1 parent 3a25329 commit fa16c49
Show file tree
Hide file tree
Showing 11 changed files with 118 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public App()
{
_ = services.AddScoped<WebView.Providers.IWebViewCommunicationProvider, WebView.Providers.WebViewCommunicationProvider>();
_ = services.AddScoped<WebView.Services.IWebViewService, WebView.Services.WebViewService>();
_ = services.AddScoped<Pwsh.Providers.IPwshProvider, Pwsh.Providers.PwshProvider>();
_ = services.AddScoped<Pwsh.Services.IPwshService, Pwsh.Services.PwshService>();
_ = services.AddSingleton<MainWindow>();
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,4 @@
<PackageReference Include="System.Management.Automation" Version="7.1.4" />
</ItemGroup>

<ItemGroup>
<Folder Include="Pwsh\Providers\" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ namespace HoubyStudio.LazyAdmin.DesktopApp
using System;
using System.IO;
using System.Windows;
using HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Services;
using HoubyStudio.LazyAdmin.DesktopApp.WebView.Services;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Web.WebView2.Core;
Expand All @@ -25,14 +26,16 @@ public partial class MainWindow : Window
// public static WebView2 WebView => webView1;
// public static void SetWebView(WebView2 value) => webView1 = value;
private readonly IWebViewService webViewService;
private readonly IPwshService pwshService;

//private static LazyAdminPowerShell lazyAdminPwsh = new();

/// <summary>
/// Initializes a new instance of the <see cref="MainWindow"/> class.
/// </summary>
/// <param name="webViewService">To be removed.</param>
public MainWindow(IWebViewService webViewService)
/// <param name="webViewService">WebView service.</param>
/// <param name="pwshService">Pwsh service.</param>
public MainWindow(IWebViewService webViewService, IPwshService pwshService)
{
// Required. Loads the compiled page of a component from XAML.
this.InitializeComponent();
Expand All @@ -41,7 +44,11 @@ public MainWindow(IWebViewService webViewService)
// LazyAdminWebView.WebView = this.webView;
// SetWebView(this.webView);
this.webViewService = webViewService;
this.webViewService.InitializeWebView2Async(this.webView);
this.pwshService = pwshService;
this.webViewService.InitializeWebView2Async(this.webView, this.pwshService);
// TODO: https://codewithshadman.com/mediator-pattern-csharp/
this.webView.CoreWebView2.WebMessageReceived += this.pwshService.ReceiveMessageFromWebView;


//GetLazyAdminPwsh().MockPowerShell = this.PowerShell;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// <copyright file="IPwshProvider.cs" company="Houby Studio">
// Copyright (c) Houby Studio. All rights reserved.
// </copyright>

namespace HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Providers
{
using Microsoft.Web.WebView2.Core;
using System.Threading.Tasks;

/// <summary>
/// PowerShell process provider interface.
/// </summary>
public interface IPwshProvider
{
/// <summary>
/// Handles message received from <see cref="WebView.Providers.WebViewCommunicationProvider"/>.
/// </summary>
/// <param name="sender">Sender object.</param>
/// <param name="args">Arguments received from the event.</param>
public void ReceiveMessageFromWebView(object sender, CoreWebView2WebMessageReceivedEventArgs args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// <copyright file="PwshProvider.cs" company="Houby Studio">
// Copyright (c) Houby Studio. All rights reserved.
// </copyright>

namespace HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Providers
{
using Microsoft.Extensions.Logging;
using Microsoft.Web.WebView2.Core;

/// <summary>
/// PowerShell process provider.
/// </summary>
public class PwshProvider : IPwshProvider
{
private ILogger<PwshProvider> logger;

/// <summary>
/// Initializes a new instance of the <see cref="PwshProvider"/> class.
/// </summary>
/// <param name="logger">Dependent logger interface.</param>
public PwshProvider(ILogger<PwshProvider> logger)
{
this.logger = logger;
}

/// <inheritdoc/>
public virtual void ReceiveMessageFromWebView(object sender, CoreWebView2WebMessageReceivedEventArgs args)
{
this.logger.LogInformation("Received message from Webview!");
return;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@

namespace HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Services
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Web.WebView2.Core;

/// <summary>
/// PowerShell service interface.
/// </summary>
interface IPwshService
public interface IPwshService
{
/// <inheritdoc cref="Providers.IPwshProvider.ReceiveMessageFromWebView(object,CoreWebView2WebMessageReceivedEventArgs)"/>
public void ReceiveMessageFromWebView(object sender, CoreWebView2WebMessageReceivedEventArgs args);

public void Halo();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,42 @@

namespace HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Services
{
using HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Providers;
using Microsoft.Extensions.Logging;
using Microsoft.Web.WebView2.Core;
using System.Threading.Tasks;

/// <summary>
/// PowerShell service creates and manages powershell instances, sends data to WebView and receives data from WebView.
/// PowerShell service creates and manages PowerShell runspaces and processes, exposes method, which allows WebViewService to register events to it.
/// </summary>
public class PwshService : IPwshService
{
private readonly ILogger<PwshService> logger;
private readonly IPwshProvider pwshProvider;

/// <summary>
/// Initializes a new instance of the <see cref="PwshService"/> class.
/// </summary>
public PwshService()
/// <param name="logger">Dependent logger interface.</param>
/// <param name="pwshProvider">Dependent pwsh provider interface. </param>
public PwshService(ILogger<PwshService> logger, IPwshProvider pwshProvider)
{
this.logger = logger;
this.pwshProvider = pwshProvider;

this.logger.LogDebug("Created new PwshService");
}

/// <inheritdoc/>
public void ReceiveMessageFromWebView(object sender, CoreWebView2WebMessageReceivedEventArgs args)
{
this.pwshProvider.ReceiveMessageFromWebView(sender, args);
return;
}

public void Halo()
{
this.logger.LogInformation("WTFFFFFFFFFFFF?!?!");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace HoubyStudio.LazyAdmin.DesktopApp.WebView.Providers
{
using System.Threading.Tasks;
using HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Services;
using Microsoft.Web.WebView2.Wpf;

/// <summary>
Expand Down Expand Up @@ -33,6 +34,6 @@ public interface IWebViewCommunicationProvider
/// </summary>
/// <param name="webView">WebView2 control.</param>
/// <returns>A <see cref="Task{TResult}"/> representing the asynchronous operation.</returns>
public Task<bool> InitializeWebView2Async(WebView2 webView);
public Task<bool> InitializeWebView2Async(WebView2 webView, IPwshService pwshService);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ namespace HoubyStudio.LazyAdmin.DesktopApp.WebView.Providers
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Services;
using Microsoft.Extensions.Logging;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.Wpf;
Expand Down Expand Up @@ -36,8 +37,8 @@ public class WebViewCommunicationProvider : IWebViewCommunicationProvider
/// <summary>
/// Initializes a new instance of the <see cref="WebViewCommunicationProvider"/> class.
/// </summary>
/// <param name="logger">Represents a type used to perform logging.</param>
/// <param name="webView">WebView control assigned to this provider..</param>
/// <param name="logger">Dependent logger interface.</param>
/// <param name="pwshService">Dependent pwsh service interface.</param>
public WebViewCommunicationProvider(ILogger<WebViewCommunicationProvider> logger)
{
this.logger = logger;
Expand Down Expand Up @@ -100,12 +101,14 @@ await Task.Run(() =>
}

/// <inheritdoc/>
public virtual async Task<bool> InitializeWebView2Async(WebView2 webView)
public virtual async Task<bool> InitializeWebView2Async(WebView2 webView, IPwshService pwshService)
{
// Register event handlers to WebView2 component
try
{
webView.CoreWebView2InitializationCompleted += this.CheckWebViewInitializationStatus;
//webView.CoreWebView2.WebMessageReceived += pwshService.ReceiveMessageFromWebView;

}
catch (Exception exception)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace HoubyStudio.LazyAdmin.DesktopApp.WebView.Services
{
using System.Threading.Tasks;
using HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Services;
using Microsoft.Web.WebView2.Wpf;

/// <summary>
Expand All @@ -18,7 +19,7 @@ public interface IWebViewService
/// <inheritdoc cref="Providers.IWebViewCommunicationProvider.SendWebMessageAsJson(string, WebView2)"/>
public Task<bool> SendWebMessageAsJson(string message, WebView2 webView);

/// <inheritdoc cref="Providers.IWebViewCommunicationProvider.EnsureCoreWebView2Async(WebView2)"/>
public Task<bool> InitializeWebView2Async(WebView2 webView);
/// <inheritdoc cref="Providers.IWebViewCommunicationProvider.EnsureCoreWebView2Async(WebView2, IPwshService)"/>
public Task<bool> InitializeWebView2Async(WebView2 webView, IPwshService pwshService);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ namespace HoubyStudio.LazyAdmin.DesktopApp.WebView.Services
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HoubyStudio.LazyAdmin.DesktopApp.Pwsh.Services;
using HoubyStudio.LazyAdmin.DesktopApp.WebView.Providers;
using Microsoft.Extensions.Logging;
using Microsoft.Web.WebView2.Wpf;
using Newtonsoft.Json;

/// <summary>
/// WebView service.
/// WebView service initializes and manages WebView2 component, exposes method to send data to WebView2 component and registers events to trigger methods in other services.
/// </summary>
public class WebViewService : IWebViewService
{
Expand All @@ -32,26 +33,26 @@ public WebViewService(ILogger<WebViewService> logger, IWebViewCommunicationProvi
this.logger = logger;
this.communicationProvider = communicationProvider;

this.logger.LogInformation("Created new WebViewService");
this.logger.LogDebug("Created new WebViewService");
}

/// <inheritdoc/>
public virtual async Task<string> ShowMessageAsync(string message, WebView2 webView)
public async Task<string> ShowMessageAsync(string message, WebView2 webView)
{
return await this.communicationProvider.ShowMessageAsync(message, webView);
}

/// <inheritdoc/>
public virtual async Task<bool> SendWebMessageAsJson(string message, WebView2 webView)
public async Task<bool> SendWebMessageAsJson(string message, WebView2 webView)
{
string jsonString = JsonConvert.SerializeObject(message);
return await this.communicationProvider.SendWebMessageAsJson(jsonString, webView);
}

/// <inheritdoc/>
public virtual async Task<bool> InitializeWebView2Async(WebView2 webView)
public async Task<bool> InitializeWebView2Async(WebView2 webView, IPwshService pwshService)
{
return await this.communicationProvider.InitializeWebView2Async(webView);
return await this.communicationProvider.InitializeWebView2Async(webView, pwshService);
}
}
}

0 comments on commit fa16c49

Please sign in to comment.