From 84ebfa56c4c31abe9dba6f9c8c827aa11fe883ff Mon Sep 17 00:00:00 2001 From: ema Date: Tue, 28 Apr 2026 03:58:49 +0800 Subject: [PATCH] Stream CHM via HTTP handler and remove Helper --- .../ChmWebpagePanel.cs | 28 +++++----- .../QuickLook.Plugin.ChmViewer/Helper.cs | 52 ------------------- .../Resources/chm2html.html | 8 +-- 3 files changed, 16 insertions(+), 72 deletions(-) delete mode 100644 QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Helper.cs diff --git a/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/ChmWebpagePanel.cs b/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/ChmWebpagePanel.cs index 40ec419..07f0b0b 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/ChmWebpagePanel.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/ChmWebpagePanel.cs @@ -27,9 +27,11 @@ namespace QuickLook.Plugin.ChmViewer; public class ChmWebpagePanel : WebpagePanel { - private const string _resourcePrefix = "QuickLook.Plugin.ChmViewer.Resources."; - private static readonly Dictionary _resources = []; - private readonly byte[] _homePage; + protected const string _resourcePrefix = "QuickLook.Plugin.ChmViewer.Resources."; + protected internal static readonly Dictionary _resources = []; + protected readonly byte[] _homePage; + + protected string _path; static ChmWebpagePanel() { @@ -68,15 +70,9 @@ public class ChmWebpagePanel : WebpagePanel public void PreviewCompiledHtmlHelp(string path) { - FallbackPath = Path.GetDirectoryName(path); + _path = path; - var chmFileUrl = Helper.FilePathToFileUrl(path); - var pluginUri = new Uri($"file://quicklook/?plugin=1&chm={Uri.EscapeDataString(chmFileUrl.AbsoluteUri)}"); - - var chmFile = File.ReadAllBytes(path); // Preload the CHM file to improve performance when the WebView requests it later - _resources.Add(Uri.EscapeDataString(chmFileUrl.AbsoluteUri), chmFile); - - NavigateToUri(pluginUri); + NavigateToUri(new Uri("http://quicklook/?plugin=1&chm=http://quicklook/.chm")); } protected override void WebView_WebResourceRequested(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebResourceRequestedEventArgs args) @@ -87,21 +83,21 @@ public class ChmWebpagePanel : WebpagePanel { var requestedUri = new Uri(args.Request.Uri); - if (requestedUri.Scheme == "file") + if (requestedUri.Scheme == "http") { string absolutePath = Uri.UnescapeDataString(requestedUri.AbsolutePath); - if (absolutePath.StartsWith("/?plugin=1")) + if (absolutePath == "/") { var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse( new MemoryStream(_homePage), 200, "OK", MimeTypes.GetContentType(".html")); args.Response = response; } - else if (ContainsKey(requestedUri.AbsolutePath)) + else if (absolutePath == "/.chm") { - var stream = ReadStream(requestedUri.AbsolutePath); + Stream stream = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); var response = _webView.CoreWebView2.Environment.CreateWebResourceResponse( - stream, 200, "OK", MimeTypes.GetContentType(Path.GetExtension(requestedUri.AbsolutePath))); + stream, 200, "OK", MimeTypes.GetContentType(Path.GetExtension(".chm"))); args.Response = response; } else diff --git a/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Helper.cs b/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Helper.cs deleted file mode 100644 index 4ed82fc..0000000 --- a/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Helper.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2017-2026 QL-Win Contributors -// -// This file is part of QuickLook program. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -using System; -using System.IO; -using System.Text; - -namespace QuickLook.Plugin.ChmViewer; - -internal static class Helper -{ - public static Uri FilePathToFileUrl(string filePath) - { - var uri = new StringBuilder(); - foreach (var v in filePath) - if (v >= 'a' && v <= 'z' || v >= 'A' && v <= 'Z' || v >= '0' && v <= '9' || - v == '+' || v == '/' || v == ':' || v == '.' || v == '-' || v == '_' || v == '~' || - v > '\x80') - uri.Append(v); - else if (v == Path.DirectorySeparatorChar || v == Path.AltDirectorySeparatorChar) - uri.Append('/'); - else - uri.Append($"%{(int)v:X2}"); - if (uri.Length >= 2 && uri[0] == '/' && uri[1] == '/') // UNC path - Universal Naming Convention - uri.Insert(0, "file:"); - else - uri.Insert(0, "file:///"); - - try - { - return new Uri(uri.ToString()); - } - catch - { - return null; - } - } -} diff --git a/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Resources/chm2html.html b/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Resources/chm2html.html index 70666b3..df76763 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Resources/chm2html.html +++ b/QuickLook.Plugin/QuickLook.Plugin.ChmViewer/Resources/chm2html.html @@ -7,8 +7,8 @@