summaryrefslogtreecommitdiff
path: root/src/downloadmanager.h
Commit message (Collapse)AuthorAgeFilesLines
* Add setting to show notifications when downloads complete or fail (#2338)Jonathan Feenstra2026-05-151-0/+2
|
* Stable DownloadId refactor (#2375)Al2026-05-071-67/+240
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Encapsulate the downloads directory watcher in DirWatcherManager QFileSystemWatcher suppression currently relies on public static start/end methods and a static counter. Seven call sites pair them raw, one of them outside the class. Any exception between a pair permanently disables the watcher, and the static counter implies a singleton DownloadManager. A new DirWatcherManager owns the watcher, the counter (now an instance member), and the filtering. The only way to suspend is an RAII Guard obtained via a scopedGuard() factory. All raw pairs migrate to guards. A TODO flags the existing processEvents() in the dtor as a known reentrancy hazard worth replacing later. * Replace aboutToUpdate/update(int) with ModelResetGuard Replace the fragile two-signal protocol with a refcounted RAII ModelResetGuard. Split update(int) into aboutToResetModel/modelReset (guard only) and rowChanged(int); notifyRowChanged() is suppressed while a reset is active. Fixes "beginResetModel without endResetModel" warnings from three sites in downloadFinished/removeDownload that were pairing reset with a row update. removePending only opens a guard when an actual match is removed. * Centralize row notifications in setState and fix missed emits setState emits notifyRowChanged itself, uses indexByInfo (-1 when untracked), and re-looks up the row at each use so reply->abort() and plugin callbacks that re-enter and erase info don't produce stale signals. Remove the trailing emit loop from createMetaFile and the now-redundant notifyRowChanged calls scattered after setState. Add the two missing emits in restoreDownload (after m_Hidden) and metaDataChanged (after rename). Guard downloadFinished with a top-level DirWatcherGuard to prevent filesystem events from its writes racing with model updates. * Fix comma operator in addNXMDownload pending-dedup check The game-name comparison result was discarded by the comma operator, so the dedup only matched modId/fileId across all games. * Fix lost finished() signal on fast downloads Hoist the file-exists prompt out of startDownload so setup is straight-line. Connect finished() last and dispatch manually if the reply already finished. * Fix memory leak in DownloadInfo::createFromMeta Move the allocation past the early-return checks so path-mismatch and hidden-skip paths no longer leak a fresh DownloadInfo. * Sanitize suffix path in getDownloadFileName The collision-avoidance branch was using the raw baseName, so invalid characters sanitized out of the initial path leaked into the suffixed one. * [pre-commit.ci] Auto fixes from pre-commit.com hooks. * Remove unused alphabetical translation vector m_AlphabeticalTranslation was written but never read; drop it along with refreshAlphabeticalTranslation, ByName, and the LessThanWrapper helper. * Address PR feedback: fix redundant check and move refresh outside try catch. * Coalesce the removeDownload reset with the following refreshList Moves the ModelResetGuard out of the try-catch so it also wraps the refreshList() call below. Without this, one reset fires when the guard destructs at the end of the try block and another fires from refreshList's own guard, producing two resets where one is sufficient. * Guard the .meta creation in openMetaFile against the directory watcher openMetaFile creates the .meta file via QSettings when one does not exist; the disk write fires directoryChanged and triggers a spurious refreshList. Wrap it in a DirWatcherManager::Guard like the other meta-file editing paths. * Extract getValidGameShortName method in download manager (#2380) * Add stable download id index and PendingDownload struct Replace the (game, mod, file) tuple backing m_PendingDownloads with a named struct, and add m_ByID as an O(1) m_DownloadID-to-info index kept in sync with every m_ActiveDownloads mutation. Encapsulate the id counter behind DownloadInfo::newDownloadID(), the only supported way to consume from s_NextDownloadID. Infrastructure only; external behaviour is unchanged. * Return stable ids from the plugin-facing download API startDownloadURLs / startDownloadNexusFile / addNXMDownload now reserve and return m_DownloadID instead of a stale index. Plugin callbacks fire with m_DownloadID; downloadPath looks up via m_ByID. nxmDownloadURLsAvailable threads the reserved id into the materializing DownloadInfo, and Nexus API failures wake waiting plugins via notifyPendingDownloadFailed. Incidental: startDownload now returns bool and frees newDownload on output-open failure; createMetaFile is deferred past that check so failed starts no longer leave an orphan .meta. * Split downloadFinished into onReplyFinished slot and finishDownload The old dual-use downloadFinished(int = 0) took either an explicit index or relied on sender() when called as a slot. Split into a sender-resolved slot and an id-based direct call, removing the ambiguous index-zero path. * Introduce DownloadID alias and row/id accessors Add a DownloadID type alias for the stable per-download handle and two public accessors (downloadIDAtRow, rowForDownloadID) so callers can translate between the view's row vocabulary and the model's id vocabulary without reaching into the manager's internals. DownloadList now embeds the DownloadID in QModelIndex::internalId() so any code holding an index can identify the download directly. * Convert cancel/pause/resume action methods to take DownloadID The four methods (cancel, pause, resume, resumeDownloadInt) now accept a DownloadID, resolve through m_ByID, and no longer care about row positions. Internal callers iterate DownloadInfo* or look up via id; DownloadsTab translates row -> id at the connect boundary so the view's int-shaped signals keep working unchanged. Also switches the remaining unsigned int signatures that refer to the download id (finishDownload, downloadInfoByID, PendingDownload::reservedID, m_ByID, newDownloadID, s_NextDownloadID) to the DownloadID alias. Drive-by fix: finishDownload's retry branch could read info->m_Tries after info had been deleted in the CANCELED/retries-exhausted branch above; now re-resolves via m_ByID.value(id) before touching any fields. * [pre-commit.ci] Auto fixes from pre-commit.com hooks. * fix warnings about unused variables and size_t types * cleanup dead code * avoid calling processEvents when releasing the DirWatcherGuard * [pre-commit.ci] Auto fixes from pre-commit.com hooks. * use QEventLoop instead of manual ProcessEvents * don't call processEvents in download started and defer handling finish state in event loop * Cleanup pending download in case of failure. * Add missing notifyPendingDownloadFailed if user cancels * [pre-commit.ci] Auto fixes from pre-commit.com hooks. * Refactor pending download failure handling and cover rename failures * fix rebase bug, addNXMDownload not returning the correct type --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com>
* Download command: Add game instance check (#2388)Jeremy Rimpo2026-05-041-3/+3
| | | | | * Add game instance check - Should be ignored if not passed to command - Functions much like NXM game check
* Extended MODL / direct download handling (#2384)Jeremy Rimpo2026-05-031-0/+3
| | | | | | | * Extended MODL / direct download handling - name, modname, version, and source options added to download command - nxmhandler init adds schemas and MODL entry with default launch args - Add MODL register button to general tab - On window display, call meta function to trigger both registrations
* Add author and uploader columns to mod list (#2269)Jonathan Feenstra2025-08-181-0/+2
|
* Mass Metadata Parsing: Prevent re-querying and manual prompts to enter ↵Jonathan Feenstra2025-05-231-2/+8
| | | | | | | | | | | missing data (#2135) * Add a button to "Query Info" of every download in the list --------- Co-authored-by: Deewens <dudonadrien@gmail.com> Co-authored-by: KenJyn76 <liambonilla@gmail.com> Co-authored-by: Al <26797547+Al12rs@users.noreply.github.com>
* Add startDownloadNexusFileForGame (#2181)Jonathan Feenstra2025-01-021-1/+1
|
* Download issue fixesJeremy Rimpo2023-11-051-0/+10
| | | | | | - Add scoped watcher disabler - Disable during mod install - Update interprocess message handler to fix 'unable to communicate' issues
* Apply clang-format.Mikaël Capelle2023-07-091-103/+136
|
* Extend download speed datatypes to qint64/long long to avoid overflowJeremy Rimpo2022-05-041-4/+4
|
* Decrease rolling window size for download speedJeremy Rimpo2022-04-191-2/+2
|
* Download status improvementsJeremy Rimpo2022-04-191-2/+12
| | | | | - Better speed calculation - Add download time estimate
* Better nexus network errorsJeremy Rimpo2022-04-191-1/+1
|
* optimizations for download manager:isanae2020-12-241-1/+3
| | | | | | | - use envfs for walking directory - minimize string copies, disk access - use set of filenames to check for duplicates - use file size from envfs
* Fix callbacks for pluginlist, modlist and download manager.Mikaël Capelle2020-12-021-8/+10
|
* Compute supported extensions dynamically in installation and download manager.Mikaël Capelle2020-12-011-7/+0
|
* Switch from Qt signals to boost::signals for DownloadManager.Mikaël Capelle2020-10-111-4/+17
|
* Added Open Meta File context action to downloadserri1202020-08-201-0/+2
|
* Merge pull request #1000 from Al12rs/startup_performanceisanae2020-02-181-1/+1
|\ | | | | Startup performance
| * Allow not refreshing downloads when setting their folder, for example during ↵AL2020-02-161-1/+1
| | | | | | | | init.
* | Change Qtime to QElapsedtimer in some palaces to remove the warnings.AL2020-02-151-1/+2
|/
* Add source game column to the download listLostDragonist2019-12-061-0/+8
|
* fixed crash when starting multiple downloads with dialog boxes openedisanae2019-12-021-0/+4
| | | | fixed download manager dialog boxes not having a parent
* changed total speed and count to a list of the last 5 downloadsisanae2019-08-261-17/+0
| | | | | existing servers now merged when retrieving the download links download manager doesn't store the servers any more, queries the settings every time
* moved preferred servers into ServerListisanae2019-08-261-4/+7
|
* Add another query to get the missing file descriptionLostDragonist2019-03-241-0/+1
|
* Use MD5 when querying info before bothering the userLostDragonist2019-03-071-15/+22
|
* Multiple fixes:Silarn2019-02-181-0/+3
| | | | | | * Uses current daily/hourly rate limits * Fixed issue with translating API game string to mod game string ** Corrects issues with update checks and downloads
* Reworking update checks to use the file update info with a fallbackSilarn2019-02-181-568/+564
|
* Detect errors when writing downloads to disk and cancel downloadLostDragonist2018-08-191-0/+2
|
* Add new "Open File" right-click dialog for DownloadsFrederik “Freso” S. Olesen2018-08-061-0/+2
| | | | | | | This enables the user to directly open the downloaded archived/file which can be useful for e.g., inspection of what's inside or if they need to copy files from inside the archive to somewhere else. Saves a step compared to "Show in Folder" and then opening the file.
* Avoid asking users if they are sure they want to close of all downlaods are ↵Al12rs2018-07-171-0/+7
| | | | paused.
* Added "Open in Folder" option to downloads tab.Al12rs2018-07-161-0/+2
|
* Potential fix for corrupted downloadsSilarn2018-06-251-1/+2
|
* *Avoided some unnecessary refreshes while removing mods.Al12rs2018-05-251-0/+2
| | | | | | | | *Added "Visit on Nexus" menu entry in the downloads tab. *Added confirmation message when deleting a single download. *Changed text of messages to more easily distinguish deleting from hiding.
* Huge performace improvements for downloads tab by disabling the dirWatcher ↵Al12rs2018-05-171-3/+4
| | | | | | | | triggered refreshes. Avoid app freezes caused by stacked refresh calls. Added chack to see if a download is alerady hidden before trying to hide it. Made sure to refresh Download tab where it was othwerwise relying in the dirwatcher to refresh.
* Initial work on avoiding the spamming of the Downlods tab refresh caused by ↵Al12rs2018-05-171-0/+16
| | | | the fileSystemWatcher picking up changes made by MO itself and triggering multiple refreshes
* Download resume fixes for restarting MO, hung downloadsSilarn2018-05-131-0/+4
|
* Fixes for downloads and installsSilarn2018-05-061-2/+2
|
* Rework the existing file download dialog to pause the download while waitingSilarn2018-05-051-2/+2
| | | | - Also fixes direct calls to downloadFinished
* Use a five second delta to calculate speed for more responsive displaySilarn2018-05-031-1/+2
|
* Fix MO endorsement check and add game to ModInfo s_ModsByModIDSilarn2018-05-021-0/+8
|
* Allow downloads to display speed and complete %Silarn2018-05-011-2/+2
|
* Need to check if the file is in the download directory for creating metaSilarn2018-04-231-1/+1
|
* Support for multi-game downloadsSilarn2018-04-161-10/+13
|
* Fix both remove and reinstall updating hidden downloadsSilarn2018-04-111-0/+2
|
* Also mark hidden downloads as uninstalled; refresh plugins after filesSilarn2018-04-081-0/+3
|
* Revert "Applied clang-format on source"Sandro Jäckel2018-02-231-376/+375
| | | | This reverts commit 5e5c9c07291f6b09623d31c92b1fb61c4ede576e.
* Applied clang-format on sourceSandro Jäckel2018-02-221-375/+376
|
* Restore start download file method (2 of 3)Thomas Tanner2015-12-201-2/+2
|