<?xml version="1.0"?>
<doc>
    <assembly>
        <name>PDM.Platform</name>
    </assembly>
    <members>
        <member name="T:PDM.Platform.ArchiveFormats">
            <summary>
            Central list of archive file types PDM offers to extract, used by both the shared view-models
            (to decide whether to show the "Extract and open" action) and the Windows extractor. A pure,
            extension-based check — no process launch — so it is cheap to call from binding-facing properties.
            </summary>
        </member>
        <member name="M:PDM.Platform.ArchiveFormats.IsSupported(System.String)">
            <summary>True when <paramref name="filePath"/> looks like an archive PDM can extract.</summary>
        </member>
        <member name="M:PDM.Platform.ArchiveFormats.GetBaseName(System.String)">
            <summary>
            Returns the archive's base name without its archive extension, for naming the extraction
            folder. Handles compound tarball extensions (e.g. "movie.tar.gz" → "movie").
            </summary>
        </member>
        <member name="T:PDM.Platform.IAppPaths">
            <summary>
            Resolves the standard on-disk locations PDM uses. Today the only implementation resolves the
            Windows <c>%LOCALAPPDATA%\PerfectDownloadManager</c> layout (see <c>PDM.Core.Util.AppPaths</c>);
            macOS (<c>~/Library/Application Support</c>) and Android (app-specific storage) implementations
            follow in later phases. Logs, state, database, settings, and the license record all route
            through this seam so no shared code hard-codes an OS-specific directory.
            </summary>
        </member>
        <member name="P:PDM.Platform.IAppPaths.Root">
            <summary>Per-user application data root. Created on first use.</summary>
        </member>
        <member name="P:PDM.Platform.IAppPaths.SettingsFile">
            <summary>Path to the JSON settings file.</summary>
        </member>
        <member name="P:PDM.Platform.IAppPaths.StateDirectory">
            <summary>Directory holding per-download JSON sidecar state files.</summary>
        </member>
        <member name="P:PDM.Platform.IAppPaths.DatabaseFile">
            <summary>Path to the SQLite history/catalog database.</summary>
        </member>
        <member name="P:PDM.Platform.IAppPaths.LicenseFile">
            <summary>Path to the encrypted license record.</summary>
        </member>
        <member name="P:PDM.Platform.IAppPaths.LogsDirectory">
            <summary>Directory for log files.</summary>
        </member>
        <member name="T:PDM.Platform.IArchiveExtractor">
            <summary>
            Extracts downloaded archives (ZIP, RAR, 7z, tarballs, …). The Windows implementation drives the
            bundled 7-Zip console engine as a hidden child process, so the extraction runs entirely behind
            PDM's own UI (no 7-Zip window is ever shown). Returns PNG-agnostic results so the seam stays
            UI-framework-agnostic. Password-protected archives are reported by <see cref="M:PDM.Platform.IArchiveExtractor.InspectAsync(System.String,System.Threading.CancellationToken)"/> so
            the head can prompt before extracting.
            </summary>
        </member>
        <member name="P:PDM.Platform.IArchiveExtractor.IsAvailable">
            <summary>True when the underlying extraction engine (7-Zip) was located and can be used.</summary>
        </member>
        <member name="M:PDM.Platform.IArchiveExtractor.IsSupportedArchive(System.String)">
            <summary>True when <paramref name="filePath"/> is an archive type this extractor supports.</summary>
        </member>
        <member name="M:PDM.Platform.IArchiveExtractor.InspectAsync(System.String,System.Threading.CancellationToken)">
            <summary>
            Reads the archive header to determine whether it can be opened and whether it is password
            protected (so the head knows to prompt). Fast — reads metadata only, not the whole archive.
            </summary>
        </member>
        <member name="M:PDM.Platform.IArchiveExtractor.ExtractAsync(System.String,System.String,System.String,System.IProgress{System.Int32},System.Threading.CancellationToken)">
            <summary>
            Extracts <paramref name="archivePath"/> into <paramref name="destinationDirectory"/>, reporting
            0–100 progress. Pass <paramref name="password"/> for encrypted archives (null/empty otherwise).
            Runs headless and is cancellable (cancellation terminates the extraction process).
            </summary>
        </member>
        <member name="T:PDM.Platform.ArchiveInspection">
            <summary>Outcome of reading an archive's header.</summary>
            <param name="CanRead">Whether the archive could be opened at all (false ⇒ likely corrupt/unsupported).</param>
            <param name="IsEncrypted">Whether extraction will require a password.</param>
            <param name="Error">Optional diagnostic when <paramref name="CanRead"/> is false.</param>
        </member>
        <member name="M:PDM.Platform.ArchiveInspection.#ctor(System.Boolean,System.Boolean,System.String)">
            <summary>Outcome of reading an archive's header.</summary>
            <param name="CanRead">Whether the archive could be opened at all (false ⇒ likely corrupt/unsupported).</param>
            <param name="IsEncrypted">Whether extraction will require a password.</param>
            <param name="Error">Optional diagnostic when <paramref name="CanRead"/> is false.</param>
        </member>
        <member name="P:PDM.Platform.ArchiveInspection.CanRead">
            <summary>Whether the archive could be opened at all (false ⇒ likely corrupt/unsupported).</summary>
        </member>
        <member name="P:PDM.Platform.ArchiveInspection.IsEncrypted">
            <summary>Whether extraction will require a password.</summary>
        </member>
        <member name="P:PDM.Platform.ArchiveInspection.Error">
            <summary>Optional diagnostic when <paramref name="CanRead"/> is false.</summary>
        </member>
        <member name="T:PDM.Platform.ExtractionStatus">
            <summary>Terminal status of an extraction attempt.</summary>
        </member>
        <member name="F:PDM.Platform.ExtractionStatus.Success">
            <summary>All entries extracted successfully.</summary>
        </member>
        <member name="F:PDM.Platform.ExtractionStatus.WrongPassword">
            <summary>The archive is encrypted and the supplied password was wrong (re-prompt).</summary>
        </member>
        <member name="F:PDM.Platform.ExtractionStatus.Canceled">
            <summary>The user cancelled the extraction.</summary>
        </member>
        <member name="F:PDM.Platform.ExtractionStatus.Failed">
            <summary>Extraction failed for another reason (corrupt archive, disk error, …).</summary>
        </member>
        <member name="F:PDM.Platform.ExtractionStatus.ToolMissing">
            <summary>The 7-Zip engine could not be located, so nothing was attempted.</summary>
        </member>
        <member name="T:PDM.Platform.ExtractionResult">
            <summary>Result of an extraction attempt.</summary>
        </member>
        <member name="M:PDM.Platform.ExtractionResult.#ctor(PDM.Platform.ExtractionStatus,System.String)">
            <summary>Result of an extraction attempt.</summary>
        </member>
        <member name="T:PDM.Platform.NullArchiveExtractor">
            <summary>
            No-op extractor used when no real engine is wired (e.g. the legacy WPF head). Reports the engine
            as unavailable so callers cleanly show "not available" rather than crashing.
            </summary>
        </member>
        <member name="T:PDM.Platform.IBrowserDetector">
            <summary>
            Detects the browsers installed for the current user. The Windows implementation reads the
            registry app-paths hive with Program Files fallbacks; other desktop OSes probe their standard
            install locations. Used by the browser-setup flow to list one row per detected browser.
            </summary>
        </member>
        <member name="M:PDM.Platform.IBrowserDetector.Detect">
            <summary>Returns the browsers detected on this machine (empty when none are found).</summary>
        </member>
        <member name="T:PDM.Platform.ICaptureListener">
            <summary>
            Listens for download-capture requests forwarded by the browser integration and hands each one to
            the app. On desktop this is the local IPC channel the native-messaging host writes to (a named
            pipe on Windows, a Unix domain socket on macOS); on Android capture arrives via the share-intent
            instead. The concrete implementation owns transport, per-user access control, and its own
            anti-flood rate limiting and duplicate suppression.
            </summary>
        </member>
        <member name="M:PDM.Platform.ICaptureListener.Start">
            <summary>Starts accepting capture requests on a background task. Returns immediately.</summary>
        </member>
        <member name="M:PDM.Platform.ICaptureListener.ForgetRecent(System.String)">
            <summary>
            Evicts <paramref name="url"/> from the duplicate-suppression cache so an immediate re-send is
            treated as fresh (and re-prompts). Called when the user declines a capture prompt, so
            declining does not lock the URL out of a later retry.
            </summary>
        </member>
        <member name="T:PDM.Platform.FileIcon">
            <summary>Decoded 32-bpp BGRA icon pixels for a file, ready to hand to a UI bitmap.</summary>
            <param name="Width">Icon width in pixels.</param>
            <param name="Height">Icon height in pixels.</param>
            <param name="Bgra">Top-down BGRA8888 pixel buffer (Width*Height*4 bytes).</param>
        </member>
        <member name="M:PDM.Platform.FileIcon.#ctor(System.Int32,System.Int32,System.Byte[])">
            <summary>Decoded 32-bpp BGRA icon pixels for a file, ready to hand to a UI bitmap.</summary>
            <param name="Width">Icon width in pixels.</param>
            <param name="Height">Icon height in pixels.</param>
            <param name="Bgra">Top-down BGRA8888 pixel buffer (Width*Height*4 bytes).</param>
        </member>
        <member name="P:PDM.Platform.FileIcon.Width">
            <summary>Icon width in pixels.</summary>
        </member>
        <member name="P:PDM.Platform.FileIcon.Height">
            <summary>Icon height in pixels.</summary>
        </member>
        <member name="P:PDM.Platform.FileIcon.Bgra">
            <summary>Top-down BGRA8888 pixel buffer (Width*Height*4 bytes).</summary>
        </member>
        <member name="T:PDM.Platform.IFileIconProvider">
            <summary>
            Resolves the operating system's icon for a file so the downloads list can show each file's real
            icon (a game/installer .exe shows its own icon, a .zip shows the archive icon, and so on) instead
            of a generic app logo. Windows uses the shell (SHGetFileInfo); other OSes provide their own
            implementation later. Returns raw BGRA pixels so the seam stays UI-framework-agnostic and the head
            builds its own bitmap (no image-encoding round-trip, and NativeAOT-safe).
            </summary>
        </member>
        <member name="M:PDM.Platform.IFileIconProvider.GetIcon(System.String)">
            <summary>
            Returns the small icon for <paramref name="filePath"/>: the file's own icon when the file
            exists, otherwise a generic icon derived from its extension. Null when no icon is available.
            Implementations should cache by extension/path — icon lookups can hit the shell.
            </summary>
        </member>
        <member name="T:PDM.Platform.IHttpHandlerFactory">
            <summary>
            Creates the platform-appropriate <see cref="T:System.Net.Http.HttpMessageHandler"/> used by the download engine.
            Windows returns a WinHTTP-backed handler whose TLS ClientHello fingerprint CDNs (Cloudflare et
            al.) accept, avoiding the 403s the managed <c>SocketsHttpHandler</c> fingerprint triggers (see
            <c>PDM.Core.Net.HttpClientProvider</c> for the full rationale). macOS/Android use the managed
            stack and therefore carry the documented "may see more anti-bot 403s" limitation.
            </summary>
        </member>
        <member name="M:PDM.Platform.IHttpHandlerFactory.CreateHandler(System.Net.IWebProxy)">
            <summary>
            Builds a fresh handler. When <paramref name="proxy"/> is null the handler uses no proxy
            (parity with the current behaviour: only an explicitly configured proxy is honoured).
            </summary>
        </member>
        <member name="T:PDM.Platform.IMachineFingerprintProvider">
            <summary>
            Produces a stable, per-machine identifier used to bind license activations. The value must be
            deterministic across runs on the same machine and different across machines, and must never
            expose the raw OS identifiers it is derived from. The Windows implementation combines the
            machine GUID with the system volume serial and hashes them; macOS will use
            <c>IOPlatformUUID</c> and Android the app-scoped <c>ANDROID_ID</c>.
            </summary>
        </member>
        <member name="M:PDM.Platform.IMachineFingerprintProvider.Compute">
            <summary>Returns the stable fingerprint (a hex-encoded hash) for the current machine.</summary>
        </member>
        <member name="T:PDM.Platform.INativeHostInstaller">
            <summary>
            Installs the browser native-messaging host manifest and per-browser registration so Chromium
            browsers can launch PDM's native host. Windows writes a manifest under the app data root and
            per-user registry keys; macOS writes into <c>~/Library/.../NativeMessagingHosts</c>. Not
            applicable on Android. The published Chrome Web Store extension ID is pre-authorised so users get
            a one-click experience with nothing to sideload.
            </summary>
        </member>
        <member name="P:PDM.Platform.INativeHostInstaller.HostName">
            <summary>The native-messaging host name (e.g. <c>com.pdm.host</c>).</summary>
        </member>
        <member name="P:PDM.Platform.INativeHostInstaller.WebStoreExtensionId">
            <summary>The permanent Chrome Web Store ID of the published PDM extension.</summary>
        </member>
        <member name="P:PDM.Platform.INativeHostInstaller.WebStoreListingUrl">
            <summary>Public listing URL for the published extension.</summary>
        </member>
        <member name="M:PDM.Platform.INativeHostInstaller.IsRegistered">
            <summary>True when the host manifest is present and lists at least one extension ID.</summary>
        </member>
        <member name="M:PDM.Platform.INativeHostInstaller.GetRegisteredExtensionIds">
            <summary>Returns the extension IDs currently authorised in the host manifest (empty if unregistered).</summary>
        </member>
        <member name="M:PDM.Platform.INativeHostInstaller.RegisterChromium(System.String,System.Collections.Generic.IReadOnlyList{System.String},System.Collections.Generic.IReadOnlyList{PDM.Platform.SupportedBrowser})">
            <summary>Registers the native host for the given extension IDs against the given (or default) browsers.</summary>
        </member>
        <member name="M:PDM.Platform.INativeHostInstaller.EnsureStoreExtensionRegistered(System.String)">
            <summary>
            Idempotently ensures the published store extension is authorised without discarding any
            manually registered IDs. Safe and cheap to call on every startup; never throws.
            </summary>
        </member>
        <member name="M:PDM.Platform.INativeHostInstaller.UnregisterChromium">
            <summary>Removes the host manifest and all per-browser registrations.</summary>
        </member>
        <member name="T:PDM.Platform.INotifier">
            <summary>
            Platform notification surface. Extends the UI-agnostic <see cref="T:PDM.Core.Abstractions.INotificationService"/> the
            download manager already raises events through, so existing callers are unaffected, while giving
            the platform layer a distinct seam to bind a native implementation (Windows tray balloon / WinRT
            toast today, <c>UNUserNotification</c> on macOS, a notification channel on Android). No members
            are added yet — parity-first — but the dedicated type lets the composition root wire an
            OS-specific notifier without the core taking a dependency on any concrete presentation stack.
            </summary>
        </member>
        <member name="T:PDM.Platform.IPowerController">
            <summary>
            Platform seam for OS power actions the app can trigger on the user's behalf — currently just an
            orderly shutdown used by the "shut down PC when the download completes" option. Kept behind an
            interface so the shared UI stays OS-agnostic and non-Windows heads can supply their own impl later.
            </summary>
        </member>
        <member name="M:PDM.Platform.IPowerController.Shutdown">
            <summary>
            Requests an orderly system shutdown. Implementations should allow the OS to close apps
            normally rather than forcing a hard power-off. Returns false when the request could not be
            initiated (e.g. insufficient privilege) so the caller can surface a friendly message.
            </summary>
        </member>
        <member name="T:PDM.Platform.ISecretStore">
             <summary>
             Stores small, sensitive blobs (the signed license token, the trial anchor) encrypted at rest
             and readable only by the current user. Replaces the Windows-only <c>DpapiLicenseStore</c> with a
             per-OS seam: Windows uses DPAPI, macOS will use Keychain Services, Android the Keystore /
             EncryptedSharedPreferences. Callers address secrets by a stable logical name
             and never see the underlying storage mechanism.
            
             Implementations must be safe for concurrent use and must treat unreadable/corrupt entries as
             "absent" (return null) rather than throwing, so a tampered or foreign-user file degrades to a
             fresh-start rather than a crash.
             </summary>
        </member>
        <member name="M:PDM.Platform.ISecretStore.LoadAsync(System.String,System.Threading.CancellationToken)">
            <summary>Returns the decrypted bytes for <paramref name="name"/>, or null if absent/unreadable.</summary>
        </member>
        <member name="M:PDM.Platform.ISecretStore.SaveAsync(System.String,System.Byte[],System.Threading.CancellationToken)">
            <summary>Encrypts and persists <paramref name="data"/> under <paramref name="name"/>, replacing any existing value.</summary>
        </member>
        <member name="M:PDM.Platform.ISecretStore.DeleteAsync(System.String,System.Threading.CancellationToken)">
            <summary>Removes the secret. Returns true if something was deleted, false if it did not exist.</summary>
        </member>
        <member name="T:PDM.Platform.ISingleInstance">
            <summary>
            Enforces a single running instance of PDM per user and lets a second launch surface the primary
            instance instead of starting a duplicate. Windows uses a named mutex plus a user32 window
            activation; macOS will use a file lock / distributed notification. Not applicable on Android
            (single instance by design).
            </summary>
        </member>
        <member name="P:PDM.Platform.ISingleInstance.IsFirstInstance">
            <summary>True on the first instance; false when another PDM is already running for this user.</summary>
        </member>
        <member name="M:PDM.Platform.ISingleInstance.ActivateExisting">
            <summary>
            Best-effort: asks the already-running instance to bring its main window to the foreground.
            Typically called by a secondary instance just before it exits.
            </summary>
        </member>
        <member name="T:PDM.Platform.ITrayIcon">
            <summary>
            A notification-area (system tray) icon. On Windows this is backed today by the WPF-UI tray
            (rewritten to Avalonia's <c>TrayIcon</c> in Phase 2); macOS maps it to a status-bar item; it is
            not applicable on Android. Kept minimal and behaviour-neutral for the migration: show/hide,
            tooltip, an activation event, and a balloon passthrough.
            </summary>
        </member>
        <member name="P:PDM.Platform.ITrayIcon.Tooltip">
            <summary>Tooltip shown when hovering the icon.</summary>
        </member>
        <member name="P:PDM.Platform.ITrayIcon.Visible">
            <summary>Whether the icon is currently shown.</summary>
        </member>
        <member name="E:PDM.Platform.ITrayIcon.Activated">
            <summary>Raised when the user activates (clicks) the tray icon.</summary>
        </member>
        <member name="M:PDM.Platform.ITrayIcon.ShowBalloon(System.String,System.String)">
            <summary>Shows a transient balloon/toast anchored to the tray icon.</summary>
        </member>
        <member name="T:PDM.Platform.IUpdateApplier">
            <summary>
            Applies a verified, staged update to the installed application and relaunches it. The manifest
            check + signature/hash verification are shared and portable (<c>PDM.Updater</c>); only this final
            apply step is per-OS: Windows swaps the executable and relaunches, macOS replaces the
            <c>.app</c> bundle, Android defers to the Play/APK flow. Implementations run in a separate
            launcher process so the running app can exit and be overwritten.
            </summary>
        </member>
        <member name="M:PDM.Platform.IUpdateApplier.ApplyAsync(System.String,System.String,System.Threading.CancellationToken)">
            <summary>
            Replaces the application at <paramref name="targetDirectory"/> with the contents staged at
            <paramref name="stagedPackagePath"/>, then relaunches. Must have been preceded by a
            successful signature + hash verification of the staged package.
            </summary>
        </member>
        <member name="T:PDM.Platform.SupportedBrowser">
            <summary>Which browsers PDM's native host can register with.</summary>
        </member>
        <member name="F:PDM.Platform.SupportedBrowser.Chrome">
            <summary>Google Chrome.</summary>
        </member>
        <member name="F:PDM.Platform.SupportedBrowser.Edge">
            <summary>Microsoft Edge.</summary>
        </member>
        <member name="F:PDM.Platform.SupportedBrowser.Brave">
            <summary>Brave.</summary>
        </member>
        <member name="F:PDM.Platform.SupportedBrowser.Firefox">
            <summary>Mozilla Firefox.</summary>
        </member>
        <member name="T:PDM.Platform.DetectedBrowser">
            <summary>A detected installation of a browser on the current machine.</summary>
            <param name="Kind">Which browser family it is.</param>
            <param name="DisplayName">Human-readable name for the UI.</param>
            <param name="ExecutablePath">Full path to the browser executable.</param>
        </member>
        <member name="M:PDM.Platform.DetectedBrowser.#ctor(PDM.Platform.SupportedBrowser,System.String,System.String)">
            <summary>A detected installation of a browser on the current machine.</summary>
            <param name="Kind">Which browser family it is.</param>
            <param name="DisplayName">Human-readable name for the UI.</param>
            <param name="ExecutablePath">Full path to the browser executable.</param>
        </member>
        <member name="P:PDM.Platform.DetectedBrowser.Kind">
            <summary>Which browser family it is.</summary>
        </member>
        <member name="P:PDM.Platform.DetectedBrowser.DisplayName">
            <summary>Human-readable name for the UI.</summary>
        </member>
        <member name="P:PDM.Platform.DetectedBrowser.ExecutablePath">
            <summary>Full path to the browser executable.</summary>
        </member>
    </members>
</doc>
