service/MailSearchReadService.h
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "data/MailCache.h" | ||
| 4 | #include "service/SearchWorkerLane.h" | ||
| 5 | #include <QPointer> | ||
| 6 | |||
| 7 | struct MailSearchRequest { | ||
| 8 | QString databasePath; | ||
| 9 | QString query; | ||
| 10 | MailCache::SearchFilter filter; | ||
| 11 | std::optional<QString> accountId; | ||
| 12 | int limit = 20; | ||
| 13 | int offset = 0; | ||
| 14 | // Sprint 101: summaries only (MailSearchReadService::summarize). | ||
| 15 | MailSearchSummary::Detail detail = MailSearchSummary::Detail::Full; | ||
| 16 | QSet<QString> allowedFolders; // empty = every folder of the account | ||
| 17 | // Sprint 103 D-21: where about:<name> is resolved; empty = the profile's | ||
| 18 | // contacts.db (the path QuickPimBackend uses). | ||
| 19 | QString contactsDatabasePath; | ||
| 20 | }; | ||
| 21 | |||
| 22 | // Shared across windows; background search never occupies the display reader. | ||
| 23 | // Each owner has at most one pending request per lane. Cancellation | ||
| 24 | // interrupts SQLite. Sprint 101 S101.1.3: result pages and summaries run on | ||
| 25 | // two lanes with their own worker, so a page never waits for a summary. | ||
| 26 | class MailSearchReadService final : public QObject { | ||
| 27 | public: | ||
| 28 | using Callback = std::function<void(MailSearchPage)>; | ||
| 29 | using Executor = std::function<MailSearchPage(const MailSearchRequest &, const std::atomic_bool &)>; | ||
| 30 | using SummaryCallback = std::function<void(MailSearchSummary)>; | ||
| 31 | using SummaryExecutor = std::function<MailSearchSummary(const MailSearchRequest &, const std::atomic_bool &)>; | ||
| 32 | static constexpr int MaxPending = 8; | ||
| 33 | explicit MailSearchReadService(QObject *parent = nullptr, Executor executor = {}, | ||
| 34 | SummaryExecutor summaryExecutor = {}); | ||
| 35 | ~MailSearchReadService() override; | ||
| 36 | static MailSearchReadService *shared(); | ||
| 37 | static MailSearchPage readCache(const MailSearchRequest &request, const std::atomic_bool &cancelled); | ||
| 38 | static MailSearchSummary summarizeCache(const MailSearchRequest &request, const std::atomic_bool &cancelled); | ||
| 39 | void read(QObject *owner, MailSearchRequest request, Callback callback); | ||
| 40 | void cancel(QObject *owner); | ||
| 41 | void summarize(QObject *owner, MailSearchRequest request, SummaryCallback callback); | ||
| 42 | void cancelSummary(QObject *owner); | ||
| 43 | 4 | int queueDepth() const { return m_pages.queueDepth(); } | |
| 44 | 37 | int activeReads() const { return m_pages.activeReads(); } | |
| 45 | int summaryQueueDepth() const { return m_summaries.queueDepth(); } | ||
| 46 | int activeSummaries() const { return m_summaries.activeReads(); } | ||
| 47 | private: | ||
| 48 | static bool admissible(const MailSearchRequest &request, bool page); | ||
| 49 | static MailCache::SearchFilter resolvedFilter(const MailSearchRequest &request); | ||
| 50 | void stop(); | ||
| 51 | SearchWorkerLane<MailSearchRequest, MailSearchPage> m_pages; | ||
| 52 | SearchWorkerLane<MailSearchRequest, MailSearchSummary> m_summaries; | ||
| 53 | }; | ||
| 54 |