<?xml version="1.0"?>
<doc>
    <assembly>
        <name>PDM.Platform.Windows</name>
    </assembly>
    <members>
        <member name="T:PDM.Platform.Windows.BrowserDetection">
             <summary>
             Detects installed browsers on the current user's machine. Uses the registry app-paths hive
             (works for both per-user and per-machine installs of Chrome/Edge/Brave/Firefox) and falls
             back to canonical Program Files locations.
            
             Relocated unchanged from <c>PDM.App.Services</c>; the <see cref="T:PDM.Platform.SupportedBrowser"/> /
             <see cref="T:PDM.Platform.DetectedBrowser"/> value types now live in the platform-neutral <c>PDM.Platform</c>
             assembly so non-Windows heads can share them.
             </summary>
        </member>
        <member name="T:PDM.Platform.Windows.DownloadRequestListener">
             <summary>
             Listens on a per-user named pipe for download-capture requests forwarded by the browser
             native-messaging host. Each newline-delimited JSON <see cref="T:PDM.Core.Models.DownloadRequest"/> is passed
             to the supplied handler (which adds it to the running download manager), so browser-captured
             downloads land in the same queue as the UI.
            
             Security: the pipe ACL grants access only to the current user, so another user's session
             on the same machine cannot inject downloads into this instance.
            
             Anti-flood: even though the extension has its own rate limit and circuit breaker, we
             apply a second, independent sliding-window rate limit here (see <see cref="T:PDM.Platform.Windows.DownloadRequestListener.RateLimiter"/>)
             and a short-lived URL dedup cache. That way a broken or malicious extension cannot spawn
             hundreds of "New download detected" prompts in a burst, which historically hung the UI
             thread when Edge's session-restore replayed old download history to the extension.
            
             Relocated unchanged (behaviour-wise) from <c>PDM.App.Services</c> to the platform layer and
             fitted to the <see cref="T:PDM.Platform.ICaptureListener"/> seam.
             </summary>
        </member>
        <member name="F:PDM.Platform.Windows.DownloadRequestListener.PipeName">
            <summary>The per-user pipe name the native host connects to.</summary>
        </member>
        <member name="M:PDM.Platform.Windows.DownloadRequestListener.Start">
            <summary>Starts the accept loop on a background task.</summary>
        </member>
        <member name="M:PDM.Platform.Windows.DownloadRequestListener.ForgetRecent(System.String)">
            <summary>
            Removes <paramref name="url"/> from the duplicate-suppression cache so an immediate re-send
            of the same URL is treated as fresh (and re-prompts) rather than being silently ignored.
            Called when the user declines the "New download detected" prompt: declining must not lock
            the URL out of a later retry within the dedup window.
            </summary>
        </member>
        <member name="T:PDM.Platform.Windows.DownloadRequestListener.RateLimiter">
            <summary>
            Simple thread-safe sliding-window rate limiter. Tracks the timestamps of the last
            <c>max</c> allowed events and rejects further requests once the window is
            full. Public so unit tests can cover the algorithm independently of the pipe plumbing.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.DownloadRequestListener.RateLimiter.TryAcquire">
            <summary>
            Returns true if the caller may proceed. Records the acquisition so subsequent
            callers that push the window over <c>max</c> are rejected.
            </summary>
        </member>
        <member name="T:PDM.Platform.Windows.ChromiumNativeHostManifest">
            <summary>
            The Chrome Native Messaging host manifest written to disk. A named type (rather than an anonymous
            object) so it can be serialized through the source-generation context below — required for
            NativeAOT/trimming, which forbid the reflection-based serializer.
            </summary>
        </member>
        <member name="T:PDM.Platform.Windows.NativeHostJsonContext">
            <summary>Source-generation context for the Windows native-host manifest (pretty-printed on disk).</summary>
        </member>
        <member name="P:PDM.Platform.Windows.NativeHostJsonContext.ChromiumNativeHostManifest">
            <summary>
            Defines the source generated JSON serialization contract metadata for a given type.
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.NativeHostJsonContext.String">
            <summary>
            Defines the source generated JSON serialization contract metadata for a given type.
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.NativeHostJsonContext.StringArray">
            <summary>
            Defines the source generated JSON serialization contract metadata for a given type.
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.NativeHostJsonContext.Default">
            <summary>
            The default <see cref="T:System.Text.Json.Serialization.JsonSerializerContext"/> associated with a default <see cref="T:System.Text.Json.JsonSerializerOptions"/> instance.
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.NativeHostJsonContext.GeneratedSerializerOptions">
            <summary>
            The source-generated options associated with this context.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostJsonContext.#ctor">
            <inheritdoc/>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostJsonContext.#ctor(System.Text.Json.JsonSerializerOptions)">
            <inheritdoc/>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostJsonContext.GetTypeInfo(System.Type)">
            <inheritdoc/>
        </member>
        <member name="T:PDM.Platform.Windows.NativeHostRegistrar">
             <summary>
             Writes the Chrome Native Messaging host manifest and the per-user registry entries so that
             Chromium browsers can invoke <c>pdm-native-host.exe</c>. Doing this in-app means users get a
             one-click "Register with PDM" experience instead of running a PowerShell script.
            
             Relocated unchanged from <c>PDM.App.Services</c>. Kept as a static helper (its callers use it
             statically); the <see cref="T:PDM.Platform.Windows.WindowsNativeHostInstaller"/> wrapper exposes it through the
             <see cref="T:PDM.Platform.INativeHostInstaller"/> seam for DI-based callers.
             </summary>
        </member>
        <member name="F:PDM.Platform.Windows.NativeHostRegistrar.WebStoreExtensionId">
            <summary>
            The permanent Chrome Web Store ID assigned to the published "Perfect Download Manager
            Integration" extension. Everyone who installs from the store gets this same ID, so the
            app can pre-authorise it in the native-host manifest and users never have to sideload
            or paste anything.
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.NativeHostRegistrar.WebStoreListingUrl">
            <summary>Public listing URL for the published extension.</summary>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostRegistrar.RegisterChromium(System.String,System.Collections.Generic.IReadOnlyList{System.String},System.Collections.Generic.IReadOnlyList{PDM.Platform.SupportedBrowser})">
            <summary>Registers the native host for the given Chromium extension IDs.</summary>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostRegistrar.GetRegisteredExtensionIds">
            <summary>
            Returns the extension IDs currently registered in the native-host manifest, or an empty
            list if the host has not been registered yet. Lets the UI reflect existing configuration
            after an app restart instead of always showing "Not configured".
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostRegistrar.IsRegistered">
            <summary>True when the native host manifest is present and lists at least one extension ID.</summary>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostRegistrar.EnsureStoreExtensionRegistered(System.String)">
            <summary>
            Ensures the published Chrome Web Store extension ID is authorised in the native-host
            manifest (and the per-browser registry keys) without discarding any additional IDs the
            user may have registered manually (e.g. a sideloaded dev build). Safe and cheap to call
            on every app startup: it re-writes the small manifest and three registry values so a
            newly installed browser is picked up automatically. Never throws.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.NativeHostRegistrar.UnregisterChromium">
            <summary>Removes the native host manifest + all registry entries for Chromium browsers.</summary>
        </member>
        <member name="T:PDM.Platform.Windows.SevenZipArchiveExtractor">
            <summary>
            <see cref="T:PDM.Platform.IArchiveExtractor"/> backed by the 7-Zip console engine (<c>7z.exe</c> + <c>7z.dll</c>),
            run as a hidden child process so extraction happens entirely behind PDM's own UI — no 7-Zip window
            is ever shown. Handles ZIP, RAR (incl. RAR5/AES), 7z, and tarballs, with password support.
            <para>
            The engine is located in this order: the copy bundled next to the app
            (<c>&lt;app&gt;\tools\7-zip\7z.exe</c>), then a system 7-Zip install (Program Files / registry).
            Shipping a bundled copy means users don't need 7-Zip installed; the fallback keeps dev machines
            working before the bundle is produced.
            </para>
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.SevenZipArchiveExtractor.IsAvailable">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.SevenZipArchiveExtractor.IsSupportedArchive(System.String)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.SevenZipArchiveExtractor.InspectAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.SevenZipArchiveExtractor.ExtractAsync(System.String,System.String,System.String,System.IProgress{System.Int32},System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.SevenZipArchiveExtractor.TryParsePercent(System.String,System.Int32@)">
            <summary>Parses a leading percentage from a 7-Zip progress line like " 38% 19 - file".</summary>
        </member>
        <member name="M:PDM.Platform.Windows.SevenZipArchiveExtractor.ResolveSevenZipPath">
            <summary>Locates 7z.exe: bundled copy first, then a system 7-Zip install (registry / Program Files).</summary>
        </member>
        <member name="T:PDM.Platform.Windows.SingleInstance">
             <summary>
             Ensures only one instance of PDM runs per user. Uses a named <see cref="T:System.Threading.Mutex"/> so a
             second launch immediately detects the primary instance and asks Windows to bring its
             main window to the foreground instead of starting a duplicate process.
            
             Relocated unchanged (behaviour-wise) from <c>PDM.App.Services</c> to the platform layer and
             fitted to the <see cref="T:PDM.Platform.ISingleInstance"/> seam; the former <c>static ActivateExisting()</c> is
             now an instance method to satisfy the interface (its body is identical and stateless).
             </summary>
        </member>
        <member name="P:PDM.Platform.Windows.SingleInstance.IsFirstInstance">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.SingleInstance.ActivateExisting">
            <summary>
            Asks the already-running instance to activate its main window. Best-effort: on
            modern Windows the OS may still refuse to steal focus depending on user settings,
            but the window will at least flash in the taskbar.
            </summary>
        </member>
        <member name="T:PDM.Platform.Windows.WindowsAppPaths">
            <summary>
            Windows <see cref="T:PDM.Platform.IAppPaths"/> backed by <see cref="T:PDM.Core.Util.AppPaths"/> (<c>%LOCALAPPDATA%\PerfectDownloadManager</c>).
            A pure delegating wrapper — the directory layout and lazy-create semantics are unchanged.
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.WindowsAppPaths.Root">
            <inheritdoc />
        </member>
        <member name="P:PDM.Platform.Windows.WindowsAppPaths.SettingsFile">
            <inheritdoc />
        </member>
        <member name="P:PDM.Platform.Windows.WindowsAppPaths.StateDirectory">
            <inheritdoc />
        </member>
        <member name="P:PDM.Platform.Windows.WindowsAppPaths.DatabaseFile">
            <inheritdoc />
        </member>
        <member name="P:PDM.Platform.Windows.WindowsAppPaths.LicenseFile">
            <inheritdoc />
        </member>
        <member name="P:PDM.Platform.Windows.WindowsAppPaths.LogsDirectory">
            <inheritdoc />
        </member>
        <member name="T:PDM.Platform.Windows.WindowsBrowserDetector">
            <summary>
            Windows <see cref="T:PDM.Platform.IBrowserDetector"/> backed by <see cref="T:PDM.Platform.Windows.BrowserDetection"/> (registry
            app-paths + Program Files fallbacks). A thin delegating wrapper over the static helper so
            DI-based callers depend on the seam.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsBrowserDetector.Detect">
            <inheritdoc />
        </member>
        <member name="T:PDM.Platform.Windows.WindowsFileIconProvider">
            <summary>
            Windows <see cref="T:PDM.Platform.IFileIconProvider"/> backed by the shell (<c>SHGetFileInfo</c>): a game or
            installer .exe shows its own icon, a .zip shows the archive icon, and so on. When the file does
            not exist yet (an in-progress download) the icon is resolved from the extension via
            <c>SHGFI_USEFILEATTRIBUTES</c>. The <c>HICON</c> is decoded to raw top-down BGRA pixels with pure
            GDI (<c>GetIconInfo</c>/<c>GetObject</c>/<c>GetDIBits</c>) so there is no <c>System.Drawing</c>
            dependency — this keeps the seam NativeAOT-safe. Results are cached (per-path for existing files,
            per-extension otherwise) because shell lookups are relatively expensive and the list re-queries often.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsFileIconProvider.GetIcon(System.String)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsFileIconProvider.GetIcon(System.String,System.Boolean)">
            <summary>
            Returns the file's icon at the requested size: the small (16px) shell icon for list rows, or
            the large (32px) icon for the premium popup header. Same resolution + caching rules as
            <see cref="M:PDM.Platform.Windows.WindowsFileIconProvider.GetIcon(System.String)"/>.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsFileIconProvider.DecodeIcon(System.IntPtr)">
            <summary>
            Converts an <c>HICON</c> to a top-down BGRA8888 buffer via GDI. If every alpha byte is zero
            (older 24-bpp icons carry no alpha channel), the pixels are forced opaque so the icon is visible.
            </summary>
        </member>
        <member name="T:PDM.Platform.Windows.WindowsHttpHandlerFactory">
            <summary>
            Windows <see cref="T:PDM.Platform.IHttpHandlerFactory"/>. Delegates to <see cref="M:PDM.Core.Net.HttpClientProvider.CreateHandler(System.Net.IWebProxy)"/>
            so the WinHTTP handler configuration (the CDN TLS-fingerprint fix) lives in exactly one place and
            cannot drift. On Windows this yields the WinHTTP-backed handler.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsHttpHandlerFactory.CreateHandler(System.Net.IWebProxy)">
            <inheritdoc />
        </member>
        <member name="T:PDM.Platform.Windows.WindowsMachineFingerprintProvider">
            <summary>
            Windows <see cref="T:PDM.Platform.IMachineFingerprintProvider"/> backed by <see cref="T:PDM.Licensing.MachineFingerprint"/>
            (SMBIOS firmware UUID + machine GUID, SHA-256'd). Pure delegating wrapper.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsMachineFingerprintProvider.Compute">
            <inheritdoc />
        </member>
        <member name="T:PDM.Platform.Windows.WindowsNativeHostInstaller">
            <summary>
            Windows <see cref="T:PDM.Platform.INativeHostInstaller"/>. A thin instance-facing wrapper over the static
            <see cref="T:PDM.Platform.Windows.NativeHostRegistrar"/> so DI-based callers (and future non-Windows heads) depend on
            the seam rather than the concrete registry/manifest helper.
            </summary>
        </member>
        <member name="P:PDM.Platform.Windows.WindowsNativeHostInstaller.HostName">
            <inheritdoc />
        </member>
        <member name="P:PDM.Platform.Windows.WindowsNativeHostInstaller.WebStoreExtensionId">
            <inheritdoc />
        </member>
        <member name="P:PDM.Platform.Windows.WindowsNativeHostInstaller.WebStoreListingUrl">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsNativeHostInstaller.IsRegistered">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsNativeHostInstaller.GetRegisteredExtensionIds">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsNativeHostInstaller.RegisterChromium(System.String,System.Collections.Generic.IReadOnlyList{System.String},System.Collections.Generic.IReadOnlyList{PDM.Platform.SupportedBrowser})">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsNativeHostInstaller.EnsureStoreExtensionRegistered(System.String)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsNativeHostInstaller.UnregisterChromium">
            <inheritdoc />
        </member>
        <member name="T:PDM.Platform.Windows.WindowsPowerController">
            <summary>
            Windows <see cref="T:PDM.Platform.IPowerController"/> that performs an orderly shutdown via <c>shutdown.exe</c>.
            Uses <c>/s</c> (shut down) with a short grace period so the OS closes running apps cleanly, matching
            what download managers like IDM do when "turn off the computer when done" is enabled.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsPowerController.Shutdown">
            <inheritdoc />
        </member>
        <member name="T:PDM.Platform.Windows.WindowsSecretStore">
             <summary>
             Windows <see cref="T:PDM.Platform.ISecretStore"/> backed by DPAPI at current-user scope, mirroring the
             protection <c>DpapiLicenseStore</c> already applies to the license record: each secret is
             encrypted with a static app entropy and written atomically to a file under a per-user secrets
             directory. A corrupt or foreign-user file is treated as absent (returns null) rather than
             throwing, so tampering degrades to a fresh start.
            
             This is the general-purpose seam the migration moves the license/trial persistence onto; the
             existing <c>DpapiLicenseStore</c> continues to work unchanged during Phase 0.
             </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsSecretStore.#ctor(System.String)">
            <summary>
            Creates a store rooted at <paramref name="directory"/> (created if missing). Callers typically
            pass a "secrets" subfolder of <see cref="P:PDM.Platform.IAppPaths.Root"/>.
            </summary>
        </member>
        <member name="M:PDM.Platform.Windows.WindowsSecretStore.LoadAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsSecretStore.SaveAsync(System.String,System.Byte[],System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Platform.Windows.WindowsSecretStore.DeleteAsync(System.String,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
    </members>
</doc>
