<?xml version="1.0"?>
<doc>
    <assembly>
        <name>PDM.Infrastructure</name>
    </assembly>
    <members>
        <member name="T:PDM.Infrastructure.DownloadManager">
             <summary>
             The orchestrator that sits between the UI and the raw download engine. It owns the
             queue of downloads, enforces the configured maximum-simultaneous-transfers limit,
             persists every state change to the SQLite catalog, and raises events for UI binding.
            
             Design notes:
             <list type="bullet">
               <item>Adding a download persists it and (optionally) enqueues it.</item>
               <item>The scheduler loop wakes on new additions or completions and starts as many
                     queued downloads as the concurrency limit allows.</item>
               <item>Pause is expressed by cancelling the per-download token; the engine leaves
                     resumable state on disk so a later resume continues without loss.</item>
               <item>Removal cancels an in-flight transfer, deletes the sidecar state and part
                     file, and (optionally) the finished file.</item>
             </list>
             </summary>
        </member>
        <member name="P:PDM.Infrastructure.DownloadManager.ScheduleTick">
            <summary>How often the scheduler wakes up to re-check the quiet-hours window.</summary>
        </member>
        <member name="P:PDM.Infrastructure.DownloadManager.ResumeUrlTrustWindow">
            <summary>
            How long a paused download's stored URL is trusted before a resume re-probes it. Signed/CDN links
            typically stay valid for many minutes, so a download resumed shortly after being paused can start
            transferring immediately instead of paying a probe round trip first.
            </summary>
        </member>
        <member name="P:PDM.Infrastructure.DownloadManager.MaxConnectionsPerDownloadCap">
            <summary>
            Optional upper bound on the parallel connections a single download may use, layered on top of
            <see cref="P:PDM.Core.Models.AppSettings.MaxConnectionsPerDownload"/>. Null means no cap (the setting is used as-is).
            The composition root sets this to a small value for unlicensed/expired installs so accelerated
            multi-connection downloading is a licensed feature, while downloads still work at reduced speed.
            Applies to downloads planned after it changes (new downloads and re-planned resumes).
            </summary>
        </member>
        <member name="P:PDM.Infrastructure.DownloadManager.MaxSimultaneousDownloadsCap">
            <summary>
            Optional upper bound on how many downloads may transfer at the same time, layered on top of
            <see cref="P:PDM.Core.Models.AppSettings.MaxSimultaneousDownloads"/>. Null means no cap. The composition root sets
            this for unlicensed/expired installs so simultaneous downloading is a licensed feature; extra
            downloads simply queue and start as slots free up.
            </summary>
        </member>
        <member name="P:PDM.Infrastructure.DownloadManager.RunningCount">
            <summary>Number of downloads currently transferring (used by the UI to explain queueing).</summary>
        </member>
        <member name="P:PDM.Infrastructure.DownloadManager.EffectiveMaxSimultaneousDownloads">
            <summary>
            Effective simultaneous-download limit: the user's setting, clamped down to
            <see cref="P:PDM.Infrastructure.DownloadManager.MaxSimultaneousDownloadsCap"/> when one is set.
            </summary>
        </member>
        <member name="E:PDM.Infrastructure.DownloadManager.DownloadAdded">
            <summary>Raised when a download is added.</summary>
        </member>
        <member name="E:PDM.Infrastructure.DownloadManager.DownloadChanged">
            <summary>Raised when a download reaches a new lifecycle status.</summary>
        </member>
        <member name="E:PDM.Infrastructure.DownloadManager.DownloadRemoved">
            <summary>Raised when a download is removed from the manager.</summary>
        </member>
        <member name="E:PDM.Infrastructure.DownloadManager.ProgressUpdated">
            <summary>Raised for each progress snapshot delivered by the engine.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.IsInScheduledDownloadWindow">
            <summary>Returns true when the current local time is within the configured quiet-hours schedule.</summary>
        </member>
        <member name="P:PDM.Infrastructure.DownloadManager.Downloads">
            <summary>All downloads currently tracked by the manager.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.InitializeAsync(System.Threading.CancellationToken)">
            <summary>Loads previously-persisted downloads from the repository. Call once at startup.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.FindDuplicate(System.Uri,System.String)">
             <summary>
             Checks whether a newly-requested download matches one PDM already tracks, so the caller can
             prompt the user instead of silently starting a redundant transfer.
            
             <para>Matching uses two signals, because a URL alone is unreliable: many file hosts/CDNs hand
             out a fresh, signed, time-limited URL every time, so the same file re-downloaded arrives under
             a different URL string. So we match on:</para>
             <list type="number">
               <item>the original or post-redirect <b>URL</b> (exact, case-insensitive) — strongest; and</item>
               <item>the <b>file name</b> — <paramref name="candidateFileName"/> (typically the browser's
                     suggested name) or, when absent, the name derived from the URL path. The stored name's
                     "name (n)" numbered-copy suffix is normalized away before comparing, and a generic or
                     extension-less name is ignored to avoid false matches.</item>
             </list>
             When several downloads match, a resumable partial is preferred over an in-progress one, which
             is preferred over a completed one. Returns null when there is no meaningful duplicate (no match,
             a completed entry whose file was deleted, or a canceled entry).
            
             <para>Synchronous, in-memory catalog lookup; the only I/O is an existence check for a completed
             download's file.</para>
             </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.Classify(PDM.Infrastructure.ManagedDownload)">
            <summary>Classifies a matched download, or returns null when it should not count as a duplicate.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.ResolveCandidateName(System.Uri,System.String)">
            <summary>The file name to match on: the caller-supplied name, else one derived from the URL.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.IsUsableName(System.String)">
            <summary>
            A name is usable for matching only when it is specific enough to trust: not empty, not the
            generic "download" fallback, and carries an extension. This keeps extension-less query-only
            URLs (e.g. "/dl?id=5") from matching unrelated downloads.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.StripCopySuffix(System.String)">
            <summary>Removes a trailing " (n)" numbered-copy suffix produced by <c>PathHelper.EnsureUnique</c>.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.InspectForDuplicateAsync(System.Uri,System.String,System.String,System.Threading.CancellationToken)">
             <summary>
             Resolves a download's true identity by probing the URL, then checks it against the catalog —
             the robust duplicate check for links whose URL changes every time (Google Drive, signed CDN
             links) so the cheap URL/name match in <see cref="M:PDM.Infrastructure.DownloadManager.FindDuplicate(System.Uri,System.String)"/> can't catch them.
            
             <para>Runs the cheap in-memory check first (no network). Only if that finds nothing does it
             probe once, matching the probed effective URL, ETag, and file name + size against existing
             downloads. The probe is returned alongside the result so the caller can reuse it for the
             actual add — a genuinely new download therefore probes exactly once.</para>
             </summary>
             <returns>
             A tuple of the matched duplicate (or null) and the probe result (or null when the cheap check
             matched, or the probe failed). When non-null, the info can be passed to
             <see cref="M:PDM.Infrastructure.DownloadManager.AddAsync(System.Uri,System.String,System.String,System.Nullable{PDM.Core.Models.DownloadCategory},System.Nullable{System.Boolean},System.Boolean,System.Boolean,System.String,System.Nullable{PDM.Core.Models.OverwritePolicy},PDM.Core.Models.RemoteFileInfo,System.Threading.CancellationToken)"/> as <c>probedInfo</c>.
             </returns>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.MatchByFileInfo(PDM.Core.Models.RemoteFileInfo)">
            <summary>
            Matches a probed file identity against the catalog using strong signals: same ETag, same
            resolved effective URL, or same (file name AND size). Prefers a resumable partial over an
            in-progress download over a completed one.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.AddAsync(System.Uri,System.String,System.String,System.Nullable{PDM.Core.Models.DownloadCategory},System.Nullable{System.Boolean},System.Boolean,System.Boolean,System.String,System.Nullable{PDM.Core.Models.OverwritePolicy},PDM.Core.Models.RemoteFileInfo,System.Threading.CancellationToken)">
            <summary>
            Adds a new download for <paramref name="url"/>. When <paramref name="startImmediately"/>
            (or the user setting) is true, the manager schedules it to run subject to the limit.
            <paramref name="overwritePolicy"/> overrides the user's default collision policy for this
            one download (used by the duplicate prompt's "download a numbered copy" action, which forces
            <see cref="F:PDM.Core.Models.OverwritePolicy.Rename"/>).
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.ResumeAsync(System.Guid,System.Threading.CancellationToken)">
            <summary>Marks a download to resume if it is paused or failed and wakes the scheduler.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.ChangeUrlAsync(System.Guid,System.Uri,System.String,PDM.Infrastructure.ReplaceUrlMode,System.Threading.CancellationToken)">
             <summary>
             Replaces the URL of an existing download — the "change / refresh download link" feature.
             This is used when a link has expired (common with time-limited CDN/file-host URLs) and the
             user pastes a fresh one, possibly from a different host.
            
             <para>
             Safety is the whole point of this method. Resuming a partially-downloaded file against a URL
             that serves <em>different</em> bytes would silently corrupt the output, so the candidate URL
             is always probed and compared against the on-disk state via <see cref="T:PDM.Core.Downloading.UrlChangeEvaluator"/>
             before any bytes are reused:
             </para>
             <list type="bullet">
               <item>If nothing has downloaded yet, the URL is adopted and the plan rebuilt (fresh start).</item>
               <item>If the probe confirms the same, resumable file (matching size, non-conflicting ETag,
                     range support), the download continues from its current offsets.</item>
               <item>Otherwise, under <see cref="F:PDM.Infrastructure.ReplaceUrlMode.Auto"/>, nothing is changed and
                     <see cref="F:PDM.Infrastructure.ChangeUrlStatus.RestartRequired"/> is returned so the UI can ask the user
                     whether to restart from zero (re-call with <see cref="F:PDM.Infrastructure.ReplaceUrlMode.Restart"/>).</item>
             </list>
             A running download is paused first so its file handles are released before the swap.
             A <see cref="F:PDM.Core.Models.DownloadStatus.Completed"/> download is never modified.
             </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.ApplyProbedChangeAsync(PDM.Infrastructure.ManagedDownload,System.Uri,PDM.Core.Models.RemoteFileInfo,System.String,PDM.Infrastructure.ReplaceUrlMode,System.Threading.CancellationToken)">
            <summary>
            Applies an already-probed replacement URL to <paramref name="managed"/>. Shared by the manual
            <see cref="M:PDM.Infrastructure.DownloadManager.ChangeUrlAsync(System.Guid,System.Uri,System.String,PDM.Infrastructure.ReplaceUrlMode,System.Threading.CancellationToken)"/> path and the browser-refresh correlation
            (<see cref="M:PDM.Infrastructure.DownloadManager.TryRefreshFromCaptureAsync(System.Guid,System.Uri,System.String,System.Threading.CancellationToken)"/>). Callers must have probed <paramref name="newInfo"/>
            and ensured the download is not the <see cref="F:PDM.Core.Models.DownloadStatus.Completed"/> state; this method
            stops any in-flight run before mutating the plan/part file.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.TryRefreshFromCaptureAsync(System.Guid,System.Uri,System.String,System.Threading.CancellationToken)">
             <summary>
             Correlates a browser-captured URL with a download the user asked to "refresh from browser"
             (see the app's refresh-arming flow). The captured URL is probed and only applied to
             <paramref name="armedId"/> when it is confidently the same file (matching size, or matching
             name when size is unavailable). This guards the case where, while re-opening the download
             page, the user navigates elsewhere and starts a <em>different</em> download: that capture
             returns <see cref="F:PDM.Infrastructure.RefreshMatch.NotAMatch"/> so the caller handles it as a normal new
             download instead of hijacking the armed one.
            
             <para>On a confident match the URL change is applied with <see cref="F:PDM.Infrastructure.ReplaceUrlMode.Auto"/>,
             so progress is preserved when safe and <see cref="F:PDM.Infrastructure.RefreshMatch.RestartRequired"/> is returned
             (without touching the file) when the content cannot be continued.</para>
             </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.IsProbableSameFile(PDM.Core.Models.DownloadState,PDM.Core.Models.RemoteFileInfo)">
            <summary>
            Heuristic identity check used only for refresh correlation: is <paramref name="info"/> very
            likely the same file as <paramref name="state"/>? Size is the strongest signal; when a size
            is unavailable on either side we fall back to comparing the server-suggested file name. This
            is intentionally conservative — a wrong "match" would apply the wrong link to a download, so
            anything ambiguous returns false and is handled as a separate new download.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.StopIfRunningAsync(System.Guid)">
            <summary>
            Cancels and awaits the in-flight run for <paramref name="id"/> (if any), so its file handles
            are released. Used before mutating a download's plan/part file. The status the run settles to
            (typically Paused) is irrelevant to the caller, which overwrites it.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.ResetPlanFromProbe(PDM.Core.Models.DownloadState,PDM.Core.Models.RemoteFileInfo,PDM.Core.Models.DownloadOptions)">
            <summary>
            Rebuilds the segment plan and size/range metadata from a fresh probe and truncates the part
            file back to empty, so the download starts from zero against the new URL. Callers must ensure
            no run is in flight (see <see cref="M:PDM.Infrastructure.DownloadManager.StopIfRunningAsync(System.Guid)"/>).
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.PauseAsync(System.Guid,System.Threading.CancellationToken)">
            <summary>Pauses a running or queued download.</summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.CancelAsync(System.Guid,System.Boolean,System.Threading.CancellationToken)">
            <summary>
            Cancels a download, transitioning it to <see cref="F:PDM.Core.Models.DownloadStatus.Canceled"/> without
            removing it from the catalog. Any in-flight run is cancelled first (mirroring
            <see cref="M:PDM.Infrastructure.DownloadManager.PauseAsync(System.Guid,System.Threading.CancellationToken)"/>/<see cref="M:PDM.Infrastructure.DownloadManager.RemoveAsync(System.Guid,System.Boolean,System.Threading.CancellationToken)"/>), then the state is persisted and a
            <see cref="E:PDM.Infrastructure.DownloadManager.DownloadChanged"/> event is raised (not <see cref="E:PDM.Infrastructure.DownloadManager.DownloadRemoved"/>), so any
            bound UI can keep showing a canceled indication. No-op when the download is already
            <see cref="F:PDM.Core.Models.DownloadStatus.Completed"/> or <see cref="F:PDM.Core.Models.DownloadStatus.Canceled"/>.
            <para>
            When <paramref name="deleteFiles"/> is true, the partially-downloaded ".pdmdownload" part
            file (and any already-assembled destination file) are also removed from disk, so a cancelled
            download leaves nothing behind and must be started over. The popup's Cancel uses this so the
            action matches the "the file will be deleted, you'll download it again from the start"
            confirmation shown to the user.
            </para>
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.RemoveAsync(System.Guid,System.Boolean,System.Threading.CancellationToken)">
            <summary>
            Removes a download from the manager. When <paramref name="deleteFiles"/> is true the
            part file and any completed destination file are also deleted.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.RunPostDownloadHookAsync(PDM.Infrastructure.ManagedDownload)">
            <summary>
            Runs the user-configured post-download command against a completed file. Fire-and-forget:
            failures are logged but do not affect the download's status. Callers should await returned
            task if they want to observe completion; the manager awaits it in the terminal-state path.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.ShouldRefreshUrlOnResume(PDM.Core.Models.DownloadState)">
             <summary>
             Re-resolves <paramref name="state"/>'s source URL and, when it still points at the same
             resumable file, refreshes the persisted effective URL (and validators) so the transfer
             continues against a fresh, working link. This is what keeps resuming downloads from expiring
             hosts (signed CDN links, Google Drive, etc.) fast instead of stalling on a dead/throttled URL.
            
             <para>Best-effort and non-destructive: if the probe fails (offline) the existing effective URL
             is kept; if the probe shows the content changed or can no longer be resumed, the URL is left
             as-is and the worker/user handles it (via the download's normal failure path or "Change link").
             Never throws except on cancellation.</para>
             </summary>
             <summary>
             Decides whether a resuming download should re-probe its source URL before transferring.
            
             <para>Re-probing costs a full network round trip before any data flows, and spends an extra
             request against hosts that rate-limit per IP — so it is only worth doing when the stored link is
             actually likely to be stale:</para>
             <list type="bullet">
               <item><b>The previous attempt failed.</b> A dead or expired link is the most common reason, so
                     refresh before trying again.</item>
               <item><b>The download has been idle longer than <see cref="P:PDM.Infrastructure.DownloadManager.ResumeUrlTrustWindow"/>.</b> Signed
                     and time-limited CDN URLs expire; one left paused for hours probably has a dead link.</item>
               <item><b>The last attempt time is unknown</b> (state written by an older version): be safe and
                     refresh.</item>
             </list>
             Otherwise — the overwhelmingly common "paused and resumed a moment later" case — the link is
             trusted and the transfer starts straight away. If that assumption turns out to be wrong, the
             worker's normal failure path applies and the next resume will refresh (the first bullet).
             </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.ReparallelizeRemaining(PDM.Core.Models.DownloadState)">
            <summary>
            Re-splits the not-yet-downloaded ranges of a resuming download across the full connection
            count, so it resumes at full speed instead of crawling on the one or two connections that
            happened to be incomplete when it was paused. Downloaded bytes are preserved exactly (they
            become pre-completed segments the worker skips). No-op for single-stream (non-range) or
            unknown-size downloads, or when the remaining ranges are already well parallelised.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DownloadManager.DisposeAsync">
            <inheritdoc />
        </member>
        <member name="T:PDM.Infrastructure.DownloadEventArgs">
            <summary>Fired when a download is added, removed, or its state changes.</summary>
        </member>
        <member name="T:PDM.Infrastructure.DownloadProgressEventArgs">
            <summary>Fired when a new progress snapshot arrives from the engine for a download.</summary>
        </member>
        <member name="T:PDM.Infrastructure.DuplicateKind">
            <summary>
            Classifies how a newly-requested download relates to one PDM already knows about, so the UI can
            ask the user the right question before starting a possibly-redundant transfer.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.DuplicateKind.AlreadyDownloaded">
            <summary>
            The same URL was already downloaded to completion and the finished file is still on disk.
            Offer to open it or download a fresh numbered copy.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.DuplicateKind.PartialExists">
            <summary>
            The same URL has a partially-downloaded, non-running entry (paused or failed) with bytes on
            disk. Offer to continue it or start a new download.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.DuplicateKind.InProgress">
            <summary>
            The same URL is already queued or actively downloading. Offer to reveal it or add another
            copy anyway.
            </summary>
        </member>
        <member name="T:PDM.Infrastructure.DuplicateInfo">
            <summary>
            Describes an existing download that matches a newly-requested URL, together with how it matches.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.DuplicateInfo.#ctor(PDM.Infrastructure.DuplicateKind,PDM.Infrastructure.ManagedDownload)">
            <summary>
            Describes an existing download that matches a newly-requested URL, together with how it matches.
            </summary>
        </member>
        <member name="P:PDM.Infrastructure.DuplicateInfo.CanResume">
            <summary>Whether the matched partial download can be resumed from its current offset.</summary>
        </member>
        <member name="T:PDM.Infrastructure.ManagedDownload">
            <summary>
            A wrapper the <see cref="T:PDM.Infrastructure.DownloadManager"/> hands out for each managed download. It
            exposes the underlying <see cref="T:PDM.Core.Models.DownloadState"/> plus the latest progress snapshot
            and control operations (pause, resume, cancel, remove). Instances are safe to bind
            to a UI: mutations happen on the manager and are surfaced via events.
            </summary>
        </member>
        <member name="P:PDM.Infrastructure.ManagedDownload.State">
            <summary>Underlying persisted state.</summary>
        </member>
        <member name="P:PDM.Infrastructure.ManagedDownload.Id">
            <summary>Convenience: the download's stable id.</summary>
        </member>
        <member name="P:PDM.Infrastructure.ManagedDownload.LatestProgress">
            <summary>The latest progress snapshot delivered by the engine, if any.</summary>
        </member>
        <member name="P:PDM.Infrastructure.ManagedDownload.FileName">
            <summary>Human-readable file name of the destination.</summary>
        </member>
        <member name="P:PDM.Infrastructure.ManagedDownload.Status">
            <summary>Current lifecycle status.</summary>
        </member>
        <member name="T:PDM.Infrastructure.ScheduleWindow">
            <summary>
            A daily "allowed to download" time window parsed from <c>HH:mm</c> strings. Downloads
            are permitted only when the current local time falls inside <see cref="P:PDM.Infrastructure.ScheduleWindow.Start"/>..<see cref="P:PDM.Infrastructure.ScheduleWindow.End"/>.
            A window that wraps midnight (e.g. 22:00 → 06:00) is handled correctly. Passing null or
            invalid strings to <see cref="M:PDM.Infrastructure.ScheduleWindow.TryParse(System.String,System.String)"/> disables the schedule (all times allowed).
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.ScheduleWindow.#ctor(System.TimeOnly,System.TimeOnly)">
            <summary>
            A daily "allowed to download" time window parsed from <c>HH:mm</c> strings. Downloads
            are permitted only when the current local time falls inside <see cref="P:PDM.Infrastructure.ScheduleWindow.Start"/>..<see cref="P:PDM.Infrastructure.ScheduleWindow.End"/>.
            A window that wraps midnight (e.g. 22:00 → 06:00) is handled correctly. Passing null or
            invalid strings to <see cref="M:PDM.Infrastructure.ScheduleWindow.TryParse(System.String,System.String)"/> disables the schedule (all times allowed).
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.ScheduleWindow.Includes(System.DateTime)">
            <summary>Returns true when <paramref name="local"/> lies inside the schedule window.</summary>
        </member>
        <member name="M:PDM.Infrastructure.ScheduleWindow.TryParse(System.String,System.String)">
            <summary>
            Parses a start/end pair; returns null when either value is missing, malformed,
            or the two values coincide (an empty window is treated as "no schedule").
            </summary>
        </member>
        <member name="T:PDM.Infrastructure.SqliteDownloadRepository">
            <summary>
            SQLite-backed catalog of downloads. Uses WAL journaling for concurrent readers and a
            single writer, parameterized queries throughout, and denormalizes only the fields
            needed for filtering; segment layout is stored as a JSON blob because segments are
            only relevant when the same download is opened by the engine again.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.SqliteDownloadRepository.InitializeAsync(System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Infrastructure.SqliteDownloadRepository.UpsertAsync(PDM.Core.Models.DownloadState,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Infrastructure.SqliteDownloadRepository.GetAsync(System.Guid,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Infrastructure.SqliteDownloadRepository.DeleteAsync(System.Guid,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Infrastructure.SqliteDownloadRepository.ListAsync(System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Infrastructure.SqliteDownloadRepository.ListByStatusAsync(System.Collections.Generic.IEnumerable{PDM.Core.Models.DownloadStatus},System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="M:PDM.Infrastructure.SqliteDownloadRepository.ListByCategoryAsync(PDM.Core.Models.DownloadCategory,System.Threading.CancellationToken)">
            <inheritdoc />
        </member>
        <member name="T:PDM.Infrastructure.ReplaceUrlMode">
            <summary>
            Controls how <see cref="M:PDM.Infrastructure.DownloadManager.ChangeUrlAsync(System.Guid,System.Uri,System.String,PDM.Infrastructure.ReplaceUrlMode,System.Threading.CancellationToken)"/> applies a replacement URL.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.ReplaceUrlMode.Auto">
            <summary>
            Probe the new URL and decide automatically: resume if it is safe, otherwise return
            <see cref="F:PDM.Infrastructure.ChangeUrlStatus.RestartRequired"/> without touching anything so the caller
            can confirm a restart with the user.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.ReplaceUrlMode.ResumeOnly">
            <summary>Only apply the URL if the existing progress can be preserved; never discard data.</summary>
        </member>
        <member name="F:PDM.Infrastructure.ReplaceUrlMode.Restart">
            <summary>Adopt the new URL and start over from zero, discarding any partial data.</summary>
        </member>
        <member name="T:PDM.Infrastructure.ChangeUrlStatus">
            <summary>Outcome of a <see cref="M:PDM.Infrastructure.DownloadManager.ChangeUrlAsync(System.Guid,System.Uri,System.String,PDM.Infrastructure.ReplaceUrlMode,System.Threading.CancellationToken)"/> call.</summary>
        </member>
        <member name="F:PDM.Infrastructure.ChangeUrlStatus.Resumed">
            <summary>The URL was changed and the download will continue from its existing progress.</summary>
        </member>
        <member name="F:PDM.Infrastructure.ChangeUrlStatus.Restarted">
            <summary>The URL was changed and the download will start over from the beginning.</summary>
        </member>
        <member name="F:PDM.Infrastructure.ChangeUrlStatus.RestartRequired">
            <summary>
            The new URL is valid but not compatible with the partial data. No change was made;
            the caller should confirm with the user and, if agreed, re-call with
            <see cref="F:PDM.Infrastructure.ReplaceUrlMode.Restart"/>.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.ChangeUrlStatus.Rejected">
            <summary>The URL could not be used at all (invalid, unreachable, a web page, etc.).</summary>
        </member>
        <member name="T:PDM.Infrastructure.ChangeUrlResult">
            <summary>
            The result of attempting to change a download's URL, including the compatibility assessment
            and the freshly probed remote file info when a probe was performed.
            </summary>
        </member>
        <member name="M:PDM.Infrastructure.ChangeUrlResult.#ctor(PDM.Infrastructure.ChangeUrlStatus,System.String,PDM.Core.Downloading.UrlChangeAssessment,PDM.Core.Models.RemoteFileInfo)">
            <summary>
            The result of attempting to change a download's URL, including the compatibility assessment
            and the freshly probed remote file info when a probe was performed.
            </summary>
        </member>
        <member name="T:PDM.Infrastructure.RefreshMatch">
            <summary>
            How a browser-captured URL relates to a download the user asked to "refresh from browser".
            Drives whether the capture is applied to the armed download or falls through to the normal
            new-download handling.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.RefreshMatch.NoDownload">
            <summary>The armed download no longer exists (removed while waiting).</summary>
        </member>
        <member name="F:PDM.Infrastructure.RefreshMatch.NotAMatch">
            <summary>
            The captured URL is not the file the user was refreshing (different name/size, a web page,
            or unreachable). The caller should treat it as an ordinary new download.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.RefreshMatch.Applied">
            <summary>The captured URL matched and the download resumed on the new link.</summary>
        </member>
        <member name="F:PDM.Infrastructure.RefreshMatch.RestartRequired">
            <summary>
            The captured URL matched the file identity but its content cannot be resumed onto the
            partial data. The caller should ask the user whether to restart from the beginning.
            </summary>
        </member>
        <member name="F:PDM.Infrastructure.RefreshMatch.Rejected">
            <summary>The captured URL matched but could not be applied for another reason.</summary>
        </member>
        <member name="T:PDM.Infrastructure.RefreshCaptureResult">
            <summary>Outcome of <see cref="M:PDM.Infrastructure.DownloadManager.TryRefreshFromCaptureAsync(System.Guid,System.Uri,System.String,System.Threading.CancellationToken)"/>.</summary>
        </member>
        <member name="M:PDM.Infrastructure.RefreshCaptureResult.#ctor(PDM.Infrastructure.RefreshMatch,PDM.Infrastructure.ChangeUrlResult)">
            <summary>Outcome of <see cref="M:PDM.Infrastructure.DownloadManager.TryRefreshFromCaptureAsync(System.Guid,System.Uri,System.String,System.Threading.CancellationToken)"/>.</summary>
        </member>
    </members>
</doc>
